2014-05-23 108 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