Python 分组内的分位数阈值/滤波器

Python 分组内的分位数阈值/滤波器,python,pandas,pandas-groupby,split-apply-combine,Python,Pandas,Pandas Groupby,Split Apply Combine,我有一个分类变量和两个数值列: np.random.seed(123) df = pd.DataFrame({'group' : ['a']*10+['b']*10, 'var1' : np.random.randn(20), 'var2' : np.random.randint(10,size=20)}) 我想通过group,找到过滤后var1的平均值,将df按组压缩到最上面的四分位var2值。也就是说,每组

我有一个分类变量和两个数值列:

np.random.seed(123)    
df = pd.DataFrame({'group' : ['a']*10+['b']*10,
                   'var1' : np.random.randn(20),
                   'var2' : np.random.randint(10,size=20)})
我想通过
group
,找到过滤后
var1
的平均值,将
df
按组压缩到最上面的四分位
var2
值。也就是说,每组的阈值为:

thresh = df.groupby('group')['var2'].quantile(0.75)
下面是一个我想要结束的循环演示:

for group, frame in df.groupby('group'):
    print(frame[frame.var2 >= frame.var2.quantile(0.75)].var1.mean())
# -1.4713362407192072
# 0.15512098976530683

结果应该是一个带有(
group
var
)列的数据帧或一个由
group
索引的序列。我相信解决方案可能涉及
.transform
/
.apply
,但我被卡在那里了。

你在找这个吗

new = df.groupby('group').apply(lambda x : \
          x[x.var2>=x.var2.quantile(0.75)] \
          .var1.mean()).to_frame()
0 团体 a-1.471336 b 0.155121
与@Bharathshetty的答案类似,但使函数更加灵活,而不是将其合并到lambda中:

def thresh_filter(obj, sort_var, tgt_var, q=0.75, stat='mean'):
    thresh = obj[sort_var].quantile(q=q)
    return getattr(obj[obj[sort_var] >= thresh][tgt_var], stat)()

print(df.groupby('group').apply(lambda x: thresh_filter(x, 'var2', 'var1')))
group
a   -1.47134
b    0.15512
dtype: float64

您需要组变量和计算平均值的数据帧,或者希望使用该值创建一个新列transformed@Bharathshetty新对象而不是新列
def thresh_filter(obj, sort_var, tgt_var, q=0.75, stat='mean'):
    thresh = obj[sort_var].quantile(q=q)
    return getattr(obj[obj[sort_var] >= thresh][tgt_var], stat)()

print(df.groupby('group').apply(lambda x: thresh_filter(x, 'var2', 'var1')))
group
a   -1.47134
b    0.15512
dtype: float64