在循环中使用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]


慕容3067478
浏览 2445回答 3
3回答

呼如林

您需要将变量设置为data等于附加数据框。与appendpython list上的方法不同,pandas append不会在原地发生import pandas as pdimport numpy as npdata = 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    B0  0  1.01  2  3.02  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时机%%timeitdata = 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%%timeita_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

一只名叫tom的猫

您可以构建数据框架而无需循环:n = 4data = pd.DataFrame({'A': np.arange(n)})data['B'] = np.NaNdata.loc[data['A'] % 2 == 0, 'B'] = data['A'] + 1对于:n = 10000这有点快:%%timeitdata = pd.DataFrame({'A': np.arange(n)})data['B'] = np.NaNdata.loc[data['A'] % 2 == 0, 'B'] = data['A'] + 1100 loops, best of 3: 3.3 ms per loop与%%timeita_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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python