【问题标题】:Change dataframes in dict更改 dict 中的数据框
【发布时间】:2019-02-11 20:03:10
【问题描述】:

请帮助我了解如何更改字典中的数据框。

让我们考虑最简单的情况,创建两个数据帧并从中构造字典。

dates = pd.date_range('20130101',periods=6)
df1 =pd.DataFrame(np.random.randn(6,4),index=dates,columns=list('ABCD'))
df2 =pd.DataFrame(np.random.randn(6,4),index=dates,columns=list('ABCD'))
DICTOR={}
DICTOR['d1']=df1
DICTOR['d2']=df2
m=DICTOR

现在我想从 dict m 内的 DataFrames 中排除行,例如 B 列中的值为零或负数的行。

我尝试了以下代码:

for name,df in m.items():
     for index, row in df.iterrows():
         if df.at[index,'B']<0:
             df.drop(index,axis=0)

或:

for name,df in m.items():
    df=df[df.B>0]

但它不起作用。

我猜我的问题是由于可变/不可变对象,但我不确定。

【问题讨论】:

    标签: python pandas dictionary for-loop


    【解决方案1】:

    您需要在迭代时为字典键分配值:

    for name, df in m.items():
        m[name] = df[df['B'] > 0]
    

    否则,您会不断地覆盖变量 df 而不会将其存储在任何地方。

    【讨论】:

      【解决方案2】:

      把你的循环改成这样:

      for name,df in m.items():
           for index, row in df.iterrows():
               if df.at[index,'B']<0:
                   df.drop(index,axis=0, inplace=True)
      

      【讨论】:

      • 注意iterrows 在可以进行矢量化操作时不推荐使用。
      • 同意。 OP 注意:我的解决方案的目的是向您展示如何解决您提出的解决方案。我建议你改用@jpp's
      【解决方案3】:

      如果您的所有数据框都有一致的索引,您应该将它们与MultiIndex 放在一起

      df = pd.concat(m)
      
      df
      
                            A         B         C         D
      d1 2013-01-01 -0.701856  1.804441 -1.224499 -0.997452
         2013-01-02 -1.122829 -0.375963  1.476828  1.254910
         2013-01-03 -0.330781 -0.692166  1.352655 -1.296063
         2013-01-04 -0.352034  0.200128  0.411482  1.058941
         2013-01-05 -0.103345  0.119615  0.251884 -0.108792
         2013-01-06  0.690312 -1.115858 -0.271362 -0.872862
      d2 2013-01-01  1.449789  0.144008 -0.445732 -0.356491
         2013-01-02  0.254142  0.102233 -0.456786  1.505599
         2013-01-03 -1.636609  0.141300 -1.458500  0.088640
         2013-01-04  0.015575  1.170128  0.229888 -0.273040
         2013-01-05  0.995011 -1.476076 -0.345353 -0.343009
         2013-01-06  0.060094  0.610622  0.192916 -1.411557
      

      此时您可以使用多种过滤方法

      df.query('B > 0')
      
                            A         B         C         D
      d1 2013-01-01 -0.701856  1.804441 -1.224499 -0.997452
         2013-01-04 -0.352034  0.200128  0.411482  1.058941
         2013-01-05 -0.103345  0.119615  0.251884 -0.108792
      d2 2013-01-01  1.449789  0.144008 -0.445732 -0.356491
         2013-01-02  0.254142  0.102233 -0.456786  1.505599
         2013-01-03 -1.636609  0.141300 -1.458500  0.088640
         2013-01-04  0.015575  1.170128  0.229888 -0.273040
         2013-01-06  0.060094  0.610622  0.192916 -1.411557
      

      【讨论】:

        猜你喜欢
        • 2019-02-23
        • 2018-12-02
        • 2019-09-27
        • 2017-11-29
        • 2021-07-23
        • 2020-01-28
        • 2013-02-06
        • 2021-08-25
        • 1970-01-01
        相关资源
        最近更新 更多