【问题标题】:Mean of repeated columns in pandas dataframe熊猫数据框中重复列的平均值
【发布时间】:2014-05-23 21:08:19
【问题描述】:

我有一个包含重复测量的重复列名的数据框。

df = pd.DataFrame({'A': randn(5), 'B': randn(5)})
df2 = pd.DataFrame({'A': randn(5), 'B': randn(5)})
df3 = pd.concat([df,df2], axis=1)
df3
      A         B         A         B
0 -0.875884 -0.298203  0.877414  1.282025
1  1.605602 -0.127038 -0.286237  0.572269
2  1.349540 -0.067487  0.126440  1.063988
3 -0.142809  1.282968  0.941925 -1.593592
4 -0.630353  1.888605 -1.176436 -1.623352

我想取 cols 'A's 和 'B's 的平均值,以便数据框缩小到

      A         B    
0  0.000765  0.491911
1  0.659682  0.222616
2  0.737990  0.498251
3  0.399558 -0.155312
4 -0.903395  0.132627

如果我做典型的

df3['A'].mean(axis=1)

我得到一个系列(没有列名),然后我应该使用每个 col 组的方法构建一个新的数据框。此外 .groupby() 方法显然不允许您按列名分组,而是您提供列并对索引进行排序。有什么奇特的方法可以做到这一点吗?

附带问题:为什么

df = pd.DataFrame({'A': randn(5), 'B': randn(5), 'A': randn(5), 'B': randn(5)})

不生成 4 列数据框,而是合并同名列?

【问题讨论】:

  • 回答你的小问题,为什么你认为用重复键定义一个字典会起作用?

标签: python pandas


【解决方案1】:

您可以使用level 关键字(将您的列视为索引的第一级(级别0),在这种情况下只有一个级别):

In [11]: df3
Out[11]:
          A         B         A         B
0 -0.367326 -0.422332  2.379907  1.502237
1 -1.060848  0.083976  0.619213 -0.303383
2  0.805418 -0.109793  0.257343  0.186462
3  2.419282 -0.452402  0.702167  0.216165
4 -0.464248 -0.980507  0.823302  0.900429

In [12]: df3.mean(axis=1, level=0)
Out[12]:
          A         B
0  1.006291  0.539952
1 -0.220818 -0.109704
2  0.531380  0.038334
3  1.560725 -0.118118
4  0.179527 -0.040039

【讨论】:

  • 宾果游戏!这就是我一直在寻找的。谢谢!
【解决方案2】:

对于这个简单的案例,您以一种奇怪的方式创建了 df3,以下将起作用:

In [86]:

df = pd.DataFrame({'A': randn(5), 'B': randn(5)})
df2 = pd.DataFrame({'A': randn(5), 'B': randn(5)})
print(df)
print(df2)

          A         B
0 -0.732807 -0.571942
1 -1.546377 -1.586371
2  0.638258  0.569980
3 -1.017427  1.395300
4  0.666853 -0.258473

[5 rows x 2 columns]
          A         B
0  0.589185  1.029062
1 -1.447809 -0.616584
2 -0.506545  0.432412
3 -1.168424  0.312796
4  1.390517  1.074129

[5 rows x 2 columns]
In [87]:

(df+df2)/2
Out[87]:
          A         B
0 -0.071811  0.228560
1 -1.497093 -1.101477
2  0.065857  0.501196
3 -1.092925  0.854048
4  1.028685  0.407828

[5 rows x 2 columns]

回答你的小问题,这与 Pandas 无关,更多的是与 dict 构造函数有关:

In [88]:

{'A': randn(5), 'B': randn(5), 'A': randn(5), 'B': randn(5)}
Out[88]:
{'B': array([-0.03087831, -0.24416885, -2.29924624,  0.68849978,  0.41938536]),
 'A': array([ 2.18471335,  0.68051101, -0.35759988,  0.54023489,  0.49029071])}

dict 键必须是唯一的,所以我的猜测是在构造函数中它只是将值重新分配给预先存在的键

编辑

如果您坚持使用重复的列,那么您必须从中创建一个新的数据框,因为如果您要更新列“A”和“B”,当列重复时,平均值仍然会重复:

In [92]:

df3 = pd.concat([df,df2], axis=1)
new_df = pd.DataFrame()
new_df['A'], new_df['B'] = df3['A'].sum(axis=1)/df3['A'].shape[1], df3['B'].sum(axis=1)/df3['B'].shape[1]
new_df
Out[92]:
          A         B
0 -0.071811  0.228560
1 -1.497093 -1.101477
2  0.065857  0.501196
3 -1.092925  0.854048
4  1.028685  0.407828

[5 rows x 2 columns]

因此,上述内容适用于 df3,实际上对于任意数量的重复列,这就是我使用 shape 的原因,如果您新的列仅重复一次,您可以将其硬编码为 2

【讨论】:

  • 我以这种方式创建它,以便我可以拥有一个带有重复 cols 的 df,这就是我实际拥有的。所以问题是如何使用已经给定的具有重复 cols 的 df 来管理它。至于附带的问题,谢谢,现在我明白了。
  • @gmask 我已经添加了一个额外的解决方案,基本上你必须创建一个新的数据框才能不重复列
猜你喜欢
  • 2018-05-15
  • 2020-03-03
  • 2019-06-06
  • 2018-06-17
  • 2021-03-10
  • 1970-01-01
  • 2020-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多