【问题标题】:How to count the number of rows after applying a condition another column, while grouping?分组时如何在应用条件另一列后计算行数?
【发布时间】:2022-11-11 11:17:59
【问题描述】:
df1 = [[aa, '21/01/2022', ''], [aa, '22/01/2022', '22/01/2022'],
       [aa, '22/01/2022', ''], [aa, '22/01/2022', ''],
       [bb, '25/01/2022', '25/01/2022'],[bb, '26/01/2022', ''], 
       [bb, '26/01/2022', ''],[cc, '21/01/2022', ''], 
       [cc, '21/01/2022', '22/01/2022'], [cc, '21/01/2022', '']]

df = pd.DataFrame(df1, columns =['userid', 'Created', 'Signed_up'])

我有上面的数据框,我想做的是在之前与另一个计划“注册”之后计算“创建”计划的数量。 意思是,数据框中的每一行都是用户生成的计划,我想计算每个用户在之前注册后生成的计划数量,考虑到每个用户可以在注册的计划中拥有,这简化了任务有点。

我的假设是使用 groupby() 和 cumsum() 或 cumcount() 的组合,但我遇到的问题是合并以前 notna() 'Signed_up' 列的条件。

期望的输出:

df2 = [[aa, '21/01/2022', '', ''], [aa, '22/01/2022', '22/01/2022', ''],
       [aa, '22/01/2022', '', '1'], [aa, '22/01/2022', '', '2'],
       [bb, '25/01/2022', '25/01/2022', ''],[bb, '26/01/2022', '', '1'], 
       [bb, '26/01/2022', '', '2'],[cc, '21/01/2022', '', ''], 
       [cc, '21/01/2022', '22/01/2022', ''], [cc, '21/01/2022', '', '1']]
    
df_3 = pd.DataFrame(df2, columns =['userid', 'Created', 'Signed_up', 'count'])

任何帮助和建议表示赞赏!提前感谢您的任何答案。

【问题讨论】:

    标签: python group-by counting cumsum


    【解决方案1】:

    代码:

    import numpy as np
    df = df.replace(r'', np.NaN)
    df['CouNT'] = df.groupby(df.groupby(['userid'])['Signed_up'].ffill()+df['userid']).cumcount()
    

    更新代码:

    df.groupby((df.groupby(['userid'])['Signed_up'].ffill()).fillna('')+df['userid']).cumcount()
    

    输出:

        userid  Created     Signed_up   cnt
    0   aa     21/01/2022   NaN         0
    1   aa     22/01/2022   22/01/2022  0
    2   aa     22/01/2022   NaN         1
    3   aa     22/01/2022   NaN         2
    4   bb     25/01/2022   25/01/2022  0
    5   bb     26/01/2022   NaN         1
    6   bb     26/01/2022   NaN         2
    7   cc     21/01/2022   NaN         0
    8   cc     21/01/2022   22/01/2022  0
    9   cc     21/01/2022   NaN         1
    

    【讨论】:

    • 谢谢楼上的回答!这实际上很有意义,虽然在逻辑中有一个意外的输出,但实际上发生了什么,第二个(外部)group by 也在 np.NaN 上分组(尚未填充 ffill( )) 并且 cumcount 也是对空白进行累积计数,这不是必需的。
    • 嗨,如果有帮助,请接受解决方案作为答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-17
    • 2020-06-05
    • 1970-01-01
    • 1970-01-01
    • 2018-01-26
    • 2019-10-07
    • 1970-01-01
    相关资源
    最近更新 更多