【问题标题】:How to loop over the groupby column using pandas?如何使用熊猫遍历 groupby 列?
【发布时间】:2023-03-24 00:08:01
【问题描述】:

我的数据框是这样的

Numbers, user_id, time_stamp
1   2   2013-11-15 03:45:04
2   2   2013-11-29 03:45:04
3   2   2013-12-09 03:45:04
4   2   2013-12-25 03:45:04
5   2   2013-12-31 03:45:04
6   3   2014-01-08 03:45:04
7   3   2014-02-03 03:45:04
7   4   2014-02-03 03:45:04

我必须找到在至少一周内的三个不同天访问该网站的 user_id。 我试过了

def gr (group):
    for i in range(1, len(group)-2):
        print (group['time_stamp'].ix[i+2] - group['time_stamp'].ix[i] <= pd.Timedelta(days=7))

df.groupby('user_id').apply(gr)

它正确显示了一些值,但随后抛出 KeyError: 3 如何过滤所有满足条件的 user_id? 谢谢。

【问题讨论】:

    标签: python pandas numpy pandas-groupby


    【解决方案1】:

    以下代码应该可以工作。但是您的示例似乎没有任何满足您条件的 user_id。

    (
        df.assign(year=df.time_stamp.dt.year,
                  woy=df.time_stamp.dt.weekofyear,
                  dow=df.time_stamp.dt.dayofweek)
        .groupby(['user_id','year','woy'])
        .filter(lambda x: x.dow.nunique()>=3)
    )
    

    【讨论】:

      【解决方案2】:

      我认为您的代码实际上应该可以工作,只是 ix[i] 尝试使用索引标签,而不是整数位置。请改用.iloc[i,:]

      但您可以使用内置的 pandas 函数更有效地执行此操作。

      Allen 举了一个这样的例子,但如果我正确阅读了问题,那么解决方案并不完全正确 - 您正在寻找任何连续 7 天的时间段,而不仅仅是一年中的特定一周。

      我相信以下应该有效:

      weekly_counts=df.set_index('timestamp').groupby('user_id').rolling('7d')['user_id'].count().rename('count')
      weekly_max=weekly_counts.groupby(level='user_id').max()
      weekly_max[weekly_max>=3].index
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-09
        • 2019-05-09
        • 2022-01-24
        • 1970-01-01
        • 1970-01-01
        • 2021-01-06
        • 2017-06-08
        • 1970-01-01
        相关资源
        最近更新 更多