2

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

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的平均值,以按 group限制为前四分位值。也就是说,每个组的阈值将是:var1dfvar2

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 或由 索引的 Series group。我相信解决方案可能涉及.transform/.apply但被困在那里。

4

2 回答 2

5

你在找这个吗?

new = df.groupby('group').apply(lambda x : \
          x[x.var2>=x.var2.quantile(0.75)] \
          .var1.mean()).to_frame()
             0
团体          
一个 -1.471336
b 0.155121

于 2017-09-28T17:00:01.330 回答
1

类似于@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
于 2017-09-28T17:02:12.463 回答