使用循环填充空 python 数据框

Filling empty python dataframe using loops

假设我想用循环中的值创建并填充一个空数据框。

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,append 也会给出对角矩阵:

>>> 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'

据我所知,由于速度问题,您应该避免逐行添加到数据帧

我平时做的是:

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
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新的space都会分配一个新的DataFrame,并且 每个组件 DataFrame 中的所有数据都被复制到新的 DataFrame 中。如果 你从 for 循环中调用 pd.concat 然后你最终按订单做 n**2 份,其中 n 是年数。

如果将部分DataFrames累积到一个列表中,调用一次pd.concat 在列表之外,则 Pandas 只需执行 n 个副本即可制作 dn.