2016-05-03 175 views
9

我在for循环中将行追加到pandas DataFrame,但最后数据框始终为空。我不想将行添加到数组,然后调用DataFrame构造器,因为我的实际for循环处理大量数据。我也试过pd.concat没有成功。任何人都可以突出显示我错过了使附录声明工作吗?这里是一个虚拟的例子:在for循环中使用pandas .append

import pandas as pd 
import numpy as np 

data = pd.DataFrame([]) 

for i in np.arange(0, 4): 
    if i % 2 == 0: 
     data.append(pd.DataFrame({'A': i, 'B': i + 1}, index=[0]), ignore_index=True) 
    else: 
     data.append(pd.DataFrame({'A': i}, index=[0]), ignore_index=True) 

print data.head() 

Empty DataFrame 
Columns: [] 
Index: [] 
[Finished in 0.676s] 

回答

6

您需要设置变量data等于附加的数据帧。与Python名单上的append方法熊猫append不到位发生

import pandas as pd 
import numpy as np 

data = pd.DataFrame([]) 

for i in np.arange(0, 4): 
    if i % 2 == 0: 
     data = data.append(pd.DataFrame({'A': i, 'B': i + 1}, index=[0]), ignore_index=True) 
    else: 
     data = data.append(pd.DataFrame({'A': i}, index=[0]), ignore_index=True) 

print(data.head()) 

    A B 
0 0 1.0 
1 2 3.0 
2 3 NaN 
+0

感谢的作品!有点傻,我没有想到这一点。 – chizze

13

每次调用追加时间,大熊猫返回原始数据框加上新行的副本。这称为二次拷贝,它是一个O(N^2)操作,它将很快变得非常慢(特别是因为你有很多数据)。

在你的情况,我会建议使用列表,追加到他们,然后调用数据帧构造函数。

a_list = [] 
b_list = [] 
for data in my_data: 
    a, b = process_data(data) 
    a_list.append(a) 
    b_list.append(b) 
df = pd.DataFrame({'A': a_list, 'B': b_list}) 
del a_list, b_list 

时序

%%timeit 
data = pd.DataFrame([]) 
for i in np.arange(0, 10000): 
    if i % 2 == 0: 
     data = data.append(pd.DataFrame({'A': i, 'B': i + 1}, index=[0]), ignore_index=True) 
else: 
    data = data.append(pd.DataFrame({'A': i}, index=[0]), ignore_index=True) 
1 loops, best of 3: 6.8 s per loop 

%%timeit 
a_list = [] 
b_list = [] 
for i in np.arange(0, 10000): 
    if i % 2 == 0: 
     a_list.append(i) 
     b_list.append(i + 1) 
    else: 
     a_list.append(i) 
     b_list.append(None) 
data = pd.DataFrame({'A': a_list, 'B': b_list}) 
100 loops, best of 3: 8.54 ms per loop 
+0

好吧,所以将它保存到一个数组,然后调用DataFrame实际上更快。谢谢! – chizze

2

你可以建立自己的数据帧没有环:

n = 4 
data = pd.DataFrame({'A': np.arange(n)}) 
data['B'] = np.NaN 
data.loc[data['A'] % 2 == 0, 'B'] = data['A'] + 1 

为:

n = 10000 

这是一个有点快:

%%timeit 
data = pd.DataFrame({'A': np.arange(n)}) 
data['B'] = np.NaN 
data.loc[data['A'] % 2 == 0, 'B'] = data['A'] + 1 

100 loops, best of 3: 3.3 ms per loop 

%%timeit 
a_list = [] 
b_list = [] 
for i in np.arange(n): 
    if i % 2 == 0: 
     a_list.append(i) 
     b_list.append(i + 1) 
    else: 
     a_list.append(i) 
     b_list.append(None) 
data1 = pd.DataFrame({'A': a_list, 'B': b_list}) 

100 loops, best of 3: 12.4 ms per loop