为了账号安全,请及时绑定邮箱和手机立即绑定

在循环中使用pandas .append

在循环中使用pandas .append

慕容3067478 2019-12-03 10:46:35
我在for循环内将行追加到pandas DataFrame,但最后该数据帧始终为空。我不想将行添加到数组中,然后再调用DataFrame构造函数,因为我的实际for循环可以处理大量数据。我也尝试pd.concat没有成功。谁能强调我缺少使append语句起作用的内容?这是一个虚拟的例子:import pandas as pdimport numpy as npdata = 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 DataFrameColumns: []Index: [][Finished in 0.676s]
查看完整描述

3 回答

?
呼如林

TA贡献1798条经验 获得超3个赞

您需要将变量设置为data等于附加数据框。与appendpython list上的方法不同,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


查看完整回答
反对 回复 2019-12-03
?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

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


查看完整回答
反对 回复 2019-12-03
?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

您可以构建数据框架而无需循环:


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


查看完整回答
反对 回复 2019-12-03
  • 3 回答
  • 0 关注
  • 2444 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信