我正在使用pandas groupby
函数并尝试获取分组结果的描述,但是没有每个组的最大和最小行。我找不到我问题的正确答案。
data = {'class': ['a', 'a', 'a', 'a', 'a', 'b', 'b', 'b', 'b', 'b'],
'num': [-10,18,12,15,50, 10,60,51,54,100]}
df = pd.DataFrame(data)
df.groupby('class').describe()
输出:
num
count mean std min 25% 50% 75% max
class
a 5.0 17.0 21.494185 -10.0 12.0 15.0 18.0 50.0
b 5.0 55.0 31.984371 10.0 51.0 54.0 60.0 100.0
我想要的结果是:
num
count mean std min 25% 50% 75% max
class
a 3.0 15.0 3.000000 12.0 13.5 15.0 16.5 18.0
b 3.0 55.0 4.582576 51.0 52.5 54.0 57.0 60.0
答案 0 :(得分:3)
使用transform
并屏蔽:
test\header.h
或者:
df['max']=df.groupby('class')['num'].transform('max')
df['min']=df.groupby('class')['num'].transform('min')
mask = df['num'].ne(df['min'])&df['num'].ne(df['max'])
df.loc[mask,:].groupby('class')['num'].describe()
count mean std min 25% 50% 75% max
class
a 3.0 15.0 3.000000 12.0 13.5 15.0 16.5 18.0
b 3.0 55.0 4.582576 51.0 52.5 54.0 57.0 60.0
答案 1 :(得分:3)
使用apply()
,idxmax()
和idxmin()
的另一种方法
>>df.groupby('class').apply(lambda x: x.drop([x['num'].idxmax(),x['num'].idxmin()])).rename_axis([None,None]).groupby('class').describe()
num
count mean std min 25% 50% 75% max
class
a 3.0 15.0 3.000000 12.0 13.5 15.0 16.5 18.0
b 3.0 55.0 4.582576 51.0 52.5 54.0 57.0 60.0
说明:对class
进行分组,并从每个组中删除max
和min
值索引。然后在class
上进行分组,然后调用describe()
函数。