2014-05-23 115 views
1

我有一个重复列名称的数据帧,这些数据帧会导致重复测量。熊猫数据帧中重复列的平均值

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?

+0

要回答你的身边的问题,为什么你认为定义有重复键的字典将工作? – EdChum

回答

4

您可以使用level keyw ORD(关于你的列的第一级只有一个级别(指数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 
+0

Bingo!这是我正在寻找的。谢谢! – gmask

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] 

回答您的问题方面,这是无关的熊猫,更做的字典构造函数:

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])} 

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

编辑

如果你坚持有重复列,那么你必须创建这个新的数据帧,因为如果你要更新列“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而事实上工作重复列的arbritary NUMER这就是为什么我使用的形状,你可以到2硬编码这个,如果你新的列只有不断重复一次

+0

我以这种方式创建了它,以便我可以拥有带有重复列的df,这是我实际拥有的。所以问题是如何用已经给出的具有重复列的df来管理它。至于侧面问题,谢谢,现在我明白了。 – gmask

+0

@gmask我已经添加了一个额外的解决方案,基本上你必须创建一个新的数据框,以避免列重复 – EdChum