簡體   English   中英

Pandas意味着groupby中的行和列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM