Pandas意味着groupby中的行和列

时间:2017-06-12 15:04:18

标签: python python-2.7 pandas

我有一个dataframe,我希望在行和列之间平均,并按Person分组。

通常我可以.mean().mean(axis=1),但是,我的数据有几个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

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分: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]

级别采用int,string或其中的列表,默认为最后一级 要堆叠的等级,可以通过等级名称。

答案 2 :(得分:2)

你可以使用fillna强制这些值为-1来取消它们的重量:

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

输出:

Person       
Person A  3.8
Person B  2.6

答案 3 :(得分:1)

如果要将结果保留在数据框中,则两步过程可能更有用:

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