在 for 循环中使用 pandas .append

新手上路,请多包涵

我在 for 循环中将行附加到 pandas DataFrame,但最后数据框始终为空。我不想将行添加到数组然后调用 DataFrame 构造函数,因为我的实际 for 循环处理大量数据。我也试过 pd.concat 但没有成功。任何人都可以强调我缺少什么来使附加语句起作用吗?这是一个虚拟示例:

 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]

原文由 calpyte 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

每次调用 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

原文由 Alexander 发布,翻译遵循 CC BY-SA 3.0 许可协议

您需要将变量 data 设置为等于附加的数据框。与 append python 列表中的方法不同,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 = 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

注意: 此答案旨在回答提出的问题。然而,它不是组合大量数据帧的最佳策略。要获得更优化的解决方案,请查看下面 亚历山大的回答

原文由 johnchase 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏