使用循环填充空的python数据框
问题内容:
可以说我想用循环中的值创建并填充一个空的数据框。
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)
即使忽略索引为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]
有更好的方法吗?有没有办法解决追加?
我的熊猫版本为‘0.13.1-557-g300610e’
问题答案:
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中。如果pd.concat
从for循环中进行调用,那么最终将按照n**2
副本的顺序进行操作,这n
是年数。
如果您在列表中累积部分DataFrame并在列表pd.concat
外调用一次,则Pandas仅需要执行n
make的副本dn
。