【问题标题】:Filling empty python dataframe using loops使用循环填充空的python数据框
【发布时间】:2015-05-08 17:24:22
【问题描述】:

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

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)

即使忽略索引为假,追加也会给出对角矩阵:

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

【问题讨论】:

  • 您是否需要以这种方式发生事件,或者普通的数据框对您来说很好(我的意思是一个带有名称的矩阵)?

标签: python pandas iteration


【解决方案1】:
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

【讨论】:

    【解决方案2】:

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

    我通常做的是:

    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
    

    【讨论】:

    • 感谢您的回答。你能告诉我为什么我们应该避免逐行添加行吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-05-04
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多