【问题标题】:Cumulative count in pandas熊猫的累计数量
【发布时间】:2020-03-30 00:08:53
【问题描述】:

我有一个包含不同列的数据框。其中一列是用户的名称(请注意,这不是唯一的意思是名称可能出现在不同的行中),另一列是 date_time 显示不同用户登录的时间和日期。现在,我想构建一个新列,显示每个用户每天的累计登录次数。具体来说,我想添加一个新功能,告诉我用户在同一天当前登录之前登录了多少次。我们应该遍历每一行并根据用户名查找同一用户在同一天但在当前登录之前的登录次数并计算它们。

您能帮我看看如何以最有效的方式编写这个吗?

输入数据框是:

user  date_time
JK    2016-01-15 09:27:00
KL    2016-02-10 12:17:00
JK    2016-01-15 11:07:00
JK    2016-01-15 12:17:10
KL    2016-02-10 12:47:00
JK    2017-11-15 08:27:00

输出数据框为:

user  date_time               cum_count
Jk    2016-01-15 09:27:00     0    
KL    2016-02-10 12:17:00     0
Jk    2016-01-15 11:07:00     1
JK    2016-01-15 12:17:10     2
KL    2016-02-10 12:47:00     1
Jk    2017-11-15 08:27:00     0

【问题讨论】:

  • 嗨,您能否添加一个example 来展示您打算做什么?
  • @RaghulRaj 我做了

标签: python pandas dataframe


【解决方案1】:

让我们做groupby + cumcount

df.groupby([df.user,df.datetime.dt.date]).cumcount()

【讨论】:

    【解决方案2】:

    使用GroupBy.cumcount

    df['cum_count'] = df.groupby(['user', df['date_time'].dt.date]).cumcount()
    #if neccesary convert to datetime
    #df['cum_count'] = df.groupby(['user',
    #                              pd.to_datetime(df['date_time']).dt.date]).cumcount()
    
    
      user           date_time  cum_count
    0   Jk 2016-01-15 09:27:00          0
    1   KL 2016-02-10 12:17:00          0
    2   Jk 2016-01-15 11:07:00          1
    3   JK 2016-01-15 12:17:10          0
    4   KL 2016-02-10 12:47:00          1
    5   Jk 2017-11-15 08:27:00          0
    

    你需要Series.str.lower 如果你不想区分用户名的大小写

    df['cum_count'] = (df.groupby([df['user'].str.lower(), 
                                   df['date_time'].dt.date]).cumcount()
    
      user           date_time  cum_count
    0   Jk 2016-01-15 09:27:00          0
    1   KL 2016-02-10 12:17:00          0
    2   Jk 2016-01-15 11:07:00          1
    3   JK 2016-01-15 12:17:10          2
    4   KL 2016-02-10 12:47:00          1
    5   Jk 2017-11-15 08:27:00          0
    

    【讨论】:

    • 那个小写字母是错误的。我修改了!你也可以修改你的答案。谢谢
    【解决方案3】:

    Pandas 分组包含 cumcount 函数,所以显而易见的解决方案 只是为了使用它。

    还有关于分组的说明:

    • 如我所见,user 列是用大写或小写写的 字母,所以按用户名分组实际上应该是大写的 用户
    • 按日期分组应在标准化日期(带时间部分 设置为 00:00:00)。

    所以代码可以是:

    df['cum_count'] = df.groupby([df.user.str.upper(), df.date_time.dt.normalize()])\
        .cumcount()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-14
      • 2018-10-30
      • 1970-01-01
      • 1970-01-01
      • 2017-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多