Python 按winsorized均值分组

Python 按winsorized均值分组,python,pandas,Python,Pandas,正常分组平均值很容易: df.groupby(['col_a','col_b']).mean()[col_i_want] 然而,如果我想应用winsorized平均值(默认限制为0.05和0.95),这相当于剪切数据集,然后执行平均值,那么突然似乎没有简单的方法可以做到这一点?我必须: winsorized_mean = [] col_i_want = 'col_c' for entry in df['col_a'].unique(): for entry2 in df['col_b'

正常分组平均值很容易:

df.groupby(['col_a','col_b']).mean()[col_i_want]
然而,如果我想应用winsorized平均值(默认限制为0.05和0.95),这相当于剪切数据集,然后执行平均值,那么突然似乎没有简单的方法可以做到这一点?我必须:

winsorized_mean = []
col_i_want = 'col_c'
for entry in df['col_a'].unique():
    for entry2 in df['col_b'].unique():
        sub_df = df[(df['col_a'] == entry) & (df['col_b'] == entry2)]
        m = sub_df[col_to_groupby].clip(lower=0.05,upper=0.95).mean()
        winsorized_mean.append([entry,entry2,m])
是否有一个我不知道的功能可以自动执行此操作

您可以使用:


必须将其编辑为
grouped=df.groupby([col_a,col_b])[col_i_want]
才能使其正常工作,但这太棒了!谢谢
import pandas as pd
from scipy.stats import trim_mean

# label 'a' will exhibit different means depending on trimming
label = ['a'] * 20 + ['b'] * 80 + ['c'] * 400 + ['a'] * 100

data = list(range(100)) + list(range(500, 1000))

df = pd.DataFrame({'label': label, 'data': data})

grouped = df.groupby('label')

# trim 5% off both ends
print(grouped.apply(stats.trim_mean, .05))

# trim 10% off both ends
print(grouped.apply(stats.trim_mean, .1))