如何使用python pandas对列进行分组并按条件计算值?

时间:2018-08-22 18:15:01

标签: python pandas

输入:

MTLTexture

需要按BusId分组,并需要以下输出

输出:

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

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

在您的系列中使用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)

答案 1 :(得分:2)

您可以使用pd.cut来避免对范围进行硬编码。只需剪切数据,然后应用cumsum

binned_data = pd.cut(df.Fair, 
                     bins=[0, 5, 10, np.inf], 
                     labels=['>=0', '>=5', '>=10'], 
                     right=False)
df = (pd.get_dummies(binned_data)
        .sort_index(axis=1, ascending=False)
        .cumsum(1)
        .groupby(df.BusId, sort=False)
        .sum()
        .iloc[:, 1::-1]))

df
       >=5  >=10
BusId           
abc1     2     1
abc2     2     0
abc3     1     0
abc4     0     0

答案 2 :(得分:1)

为避免聚合,您也可以改用state.users。实质与user3483203的答案相同:

apply