[英]Pandas mean across rows and columns in groupby
我有一個dataframe
,我想在行和列之間進行平均,並按Person
分組。
通常我可以做.mean()
和.mean(axis=1)
,但是,我的數據有幾個NaN
值,所以這個方法適用於具有NaN
值的行的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
df.set_index('Person').stack().groupby(level=0).mean().to_frame()
輸出:
Person
Person A 3.8
Person B 2.6
dtype: float64
要么
df.melt(id_vars='Person').groupby('Person')['value'].mean().to_frame()
輸出:
Person
Person A 3.8
Person B 2.6
Name: value, dtype: float64
你也可以這樣做:
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
,因為此方法返回一個Series對象,並且您想要一個數據幀
默認情況下看到該堆棧下降每個Nan值DataFrame.stack(level=-1, dropna=True)[source]
和level采用int,string或者這些列表,默認的最后一級要堆棧,可以通過級別名稱。
你可以使用fillna強制這些值為-1來取消它們的重量:
df.set_index('Person').stack().groupby(level=0).mean()
輸出:
Person
Person A 3.8
Person B 2.6
如果要將結果保留在數據框中,則兩步過程可能更有用:
df = df.set_index('Person')
df['mean'] = df.stack().groupby(level=0).mean()
輸出:
A B C mean
Person
Person A 1 2.0 NaN 3.8
Person B 1 2.0 3.0 2.6
Person B 2 NaN 5.0 2.6
Person A 4 5.0 7.0 3.8
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.