如何使用python pandas对一列进行groupby,并根据条件计算数值?[英] How to groupby a column and count the values on condition using python pandas?

本文是小编为大家收集整理的关于如何使用python pandas对一列进行groupby,并根据条件计算数值?的处理方法,想解了如何使用python pandas对一列进行groupby,并根据条件计算数值?的问题怎么解决?如何使用python pandas对一列进行groupby,并根据条件计算数值?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

输入:

df=pd.DataFrame({
    'BusId':['abc1','abc2','abc3','abc1','abc2','abc4'],
    "Fair":[5,6,7,10,5,4]
})

需要按 BusId 分组,需要如下输出

输出:

BusId   Count of Fair>=5    Count of Fair>=10
abc1    2                         1
abc2    1                         0
abc3    1                         0
abc4    0                         0

感谢您的帮助.

推荐答案

在您的系列中使用 agg 和两个辅助函数来计算高于每个阈值的值.

但是,我在此处所做的系列聚合将在 pandas 的未来版本中被弃用.

df.groupby('BusId').Fair.agg({
    'gt5': lambda x: (x>=5).sum(),
    'gt10': lambda x: (x>=10).sum()
})

       gt5  gt10
BusId
abc1     2     1
abc2     2     0
abc3     1     0
abc4     0     0

你也可以去掉 lambda:

out = df.assign(gt5=df.Fair.ge(5), gt10=df.Fair.ge(10))
out.groupby('BusId').agg({'gt5': 'sum', 'gt10': 'sum'}).astype(int)

       gt5  gt10
BusId
abc1     2     1
abc2     2     0
abc3     1     0
abc4     0     0

第二种方法会稍微快一点:

%%timeit
df.groupby('BusId').Fair.agg({
    'gt5': lambda x: (x>=5).sum(),
    'gt10': lambda x: (x>=10).sum()
})

5.05 ms ± 69 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%%timeit
out = df.assign(gt5=df.Fair.ge(5), gt10=df.Fair.ge(10))
out.groupby('BusId').agg({'gt5': 'sum', 'gt10': 'sum'}).astype(int)

3.76 ms ± 44.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

本文地址:https://www.itbaoku.cn/post/1727783.html