pandas groupby 内的分位数 threshold/filter
Quantile threshold/filter within pandas groupby
我有一个分类变量和两个数值列:
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
)列的 DataFrame 或由 group
索引的系列。我相信解决方案可能涉及 .transform
/.apply
但我被困在那里了。
你在找这个吗?
new = df.groupby('group').apply(lambda x : \
x[x.var2>=x.var2.quantile(0.75)] \
.var1.mean()).to_frame()
0
group
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
我有一个分类变量和两个数值列:
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
)列的 DataFrame 或由 group
索引的系列。我相信解决方案可能涉及 .transform
/.apply
但我被困在那里了。
你在找这个吗?
new = df.groupby('group').apply(lambda x : \
x[x.var2>=x.var2.quantile(0.75)] \
.var1.mean()).to_frame()
0 group 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