首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pandas groupby winsorized mean

Pandas groupby winsorized mean
EN

Stack Overflow用户
提问于 2019-12-09 10:57:56
回答 1查看 289关注 0票数 2

正常的groupby均值很简单:

代码语言:javascript
复制
df.groupby(['col_a','col_b']).mean()[col_i_want]

然而,如果我想应用一个窗口化的均值(默认限制为0.05和0.95),这相当于裁剪数据集,然后执行均值,突然之间似乎没有简单的方法来做到这一点?我将不得不:

代码语言:javascript
复制
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])

有没有我不知道的函数来自动做这件事?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-09 11:37:33

您可以使用scipy.stats.trim_mean

代码语言:javascript
复制
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))
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59241970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档