在循环中使用pandas .append
我在for循环内将行追加到pandas
DataFrame,但最后该数据帧始终为空。我不想将行添加到数组中,然后再调用DataFrame构造函数,因为我的实际for循环可以处理大量数据。我也尝试pd.concat
没有成功。谁能强调我要使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]
-
您需要将变量设置为
data
等于附加数据帧。与append
python list上的方法不同,pandasappend
不会在原地发生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
注意:
此答案旨在回答所提出的问题。但是,这不是组合大量数据帧的最佳策略。为了获得更好的解决方案,请在下面查看答案每次调用append时,Pandas都会返回原始数据框的副本以及您的新行。这称为二次复制,它是一个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