在循环中使用pandas .append

发布于 2021-01-29 17:30:57

我在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]
关注者
0
被浏览
178
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您需要将变量设置为data等于附加数据帧。与appendpython 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
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看