2017-06-12 20 views
2

我想要一個dataframe,我想平均跨行和列,並按Person分組。熊貓的意思是跨越行和列的組

通常情況下,我可以做.mean().mean(axis=1),但是,我的數據有幾個NaN值,所以這種方法適用inappropraite加權行與NaN

My code: 
import pandas as pd 
import numpy as np 
df = pd.DataFrame(data=[[1,2,np.nan, 'Person A'], 
         [1,2,3, 'Person B'], 
         [2,np.nan,5,'Person B'], 
         [4,5,7, 'Person A']], 
        columns=['A', 'B','C', 'Person']) 

df = df.groupby('Person').mean() 

print df.mean(axis=1) 

輸出:

Person 
Person A 4.333333 
Person B 2.500000 

所需的輸出:

Person 
Person A 3.8 
Person B 2.6 

回答

3

你也可以這樣做:

df = df.set_index('Person').stack().groupby(level='Person').mean().to_frame() 

print(df) 

      0 
Person  
Person A 3.8 
Person B 2.6 

pd.Series.to_frame用在這裏是因爲這個方法返回一個系列對象,你想要一個數據幀

默認情況下,看到stack每隔Nan值DataFrame.stack(level=-1, dropna=True)[source]

水平需要整型,字符串,或這些列表,默認爲最後一級 水平(S)堆棧,可以通過級別名稱。

+0

爲什麼這會創建一個系列而不是數據框? – user2242044

+0

@ user2242044根據pandas文檔,https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.groupby.html,de方法返回一個系列。那會影響你的結果嗎?方法棧() –

+0

沒有它不,但我試圖做一個'DataFrame'操作後,並得到一個問題,但將其轉換回'DataFrame'與'pd.Series.to_frame(df)' – user2242044

3
df.set_index('Person').stack().groupby(level=0).mean().to_frame() 

輸出:

Person 
Person A 3.8 
Person B 2.6 
dtype: float64 

OR

df.melt(id_vars='Person').groupby('Person')['value'].mean().to_frame() 

輸出:

Person 
Person A 3.8 
Person B 2.6 
Name: value, dtype: float64 
+0

謝謝。這很好,但實際應用中,我遇到了內存錯誤。任何想法如何更有效地做到這一點? – user2242044

+0

@ user2242044熔體是否更好? –

+0

我得到的錯誤:'AttributeError:'DataFrame'對象沒有屬性'melt'' – user2242044

2

您可以使用fillna迫使那些價值在-1取消其重量:

df.set_index('Person').stack().groupby(level=0).mean() 

輸出:

Person  
Person A 3.8 
Person B 2.6 
+0

謝謝你的建議,但我希望他們排除在外。如果他們到0,它會影響平均水平。 – user2242044

+0

@ user2242044修正:) – Tbaki

+0

@Tbaki previus的答案非常接近,允許我編輯。此外還有一個。 –