pandas数据帧中重复列的平均值

时间:2014-05-23 10:22:04

标签: python pandas

我有一个带有重复列名称的数据框,可以反复进行测量。

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'和'B'的意思,使数据框缩小为

      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列数据框但是合并了同名cols?

2 个答案:

答案 0 :(得分:4)

您可以使用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

答案 1 :(得分:1)

你已经以一种奇怪的方式创建了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,事实上对于重复列的一个重要的数字,这就是我使用形状的原因,你可以硬编码为2,如果你新的列只复制过一次