使用循环填充空的Python数据框

8
假设我想用循环创建并填充一个空数据框架的值。
假设您想使用循环创建并填充空数据帧的值。
import pandas as pd
import numpy as np

years = [2013, 2014, 2015]
dn=pd.DataFrame()
for year in years:
    df1 = pd.DataFrame({'Incidents': [ 'C', 'B','A'],
                 year: [1, 1, 1 ],
                }).set_index('Incidents')
    print (df1)
    dn=dn.append(df1, ignore_index = False)

追加操作会产生对角矩阵,即使忽略索引(ignore index)为false:
>>> dn
       2013  2014  2015
Incidents                  
C             1   NaN   NaN
B             1   NaN   NaN
A             1   NaN   NaN
C           NaN     1   NaN
B           NaN     1   NaN
A           NaN     1   NaN
C           NaN   NaN     1
B           NaN   NaN     1
A           NaN   NaN     1

[9 rows x 3 columns]

它应该像这样:

>>> dn
       2013  2014  2015
Incidents                  
C             1   1   1
B             1   1   1
A             1   1   1

[3 rows x 3 columns]

有没有更好的方法?并且有没有修复附加的方法?

我的pandas版本是“0.13.1-557-g300610e”


你是不是需要以这种方式来处理事件,或者一个普通的数据框对你来说就可以了(我的意思是只有一个带有名称的矩阵)? - Donbeo
2个回答

15
import pandas as pd

years = [2013, 2014, 2015]
dn = []
for year in years:
    df1 = pd.DataFrame({'Incidents': [ 'C', 'B','A'],
                 year: [1, 1, 1 ],
                }).set_index('Incidents')
    dn.append(df1)
dn = pd.concat(dn, axis=1)
print(dn)
产出
           2013  2014  2015
Incidents                  
C             1     1     1
B             1     1     1
A             1     1     1

注意,调用pd.concat在循环外部一次比在循环的每次迭代中调用pd.concat更加时间高效。

每次调用pd.concat都会为新的DataFrame分配新空间,并将每个组件DataFrame的所有数据复制到新的DataFrame中。如果你在for循环内部调用pd.concat,那么你最终会执行大约n**2次复制操作,其中n是年数。

如果您在列表中累积部分DataFrames并在列表外部调用pd.concat,那么Pandas只需要执行n次复制就可以生成dn


3
据我所知,应避免逐行向数据框中添加内容,以避免速度问题。
我通常的做法是:
l1 = []
l2 = []

for i in range(n):
   compute value v1
   compute value v2
   l1.append(v1)
   l2.append(v2)

d = pd.DataFrame()
d['l1'] = l1
d['l2'] = l2

谢谢您的回答。您能告诉我为什么我们应该避免逐行添加行吗? - aerin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接