我有一个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
答案 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