Pandas 按周分组

标签 pandas group-by grouping

我有以下 test数据框:

       date                 user  answer  
0      2018-08-19 19:08:19  pga   yes   
1      2018-08-19 19:09:27  pga   no   
2      2018-08-19 19:10:45  lry   no   
3      2018-09-07 19:12:31  lry   yes
4      2018-09-19 19:13:07  pga   yes   
5      2018-10-22 19:13:20  lry   no

我正在使用以下代码按周分组:
test.groupby(pd.Grouper(freq='W'))

我收到一个错误,即 Grouper 仅对 DatetimeIndex 有效,但是我不熟悉如何构建它以便按周分组。

最佳答案

可能你有 date列作为字符串。

为了在 Grouper 中使用它使用频率,从将此列转换为 DateTime 开始:

df['date'] = pd.to_datetime(df['date'])

然后,作为 date column 是“普通”数据列(不是索引),使用 key='date'参数和频率。

总而言之,下面有一个工作示例:
import pandas as pd

d = [['2018-08-19 19:08:19', 'pga', 'yes'],
     ['2018-08-19 19:09:27', 'pga', 'no'],
     ['2018-08-19 19:10:45', 'lry', 'no'],
     ['2018-09-07 19:12:31', 'lry', 'yes'],
     ['2018-09-19 19:13:07', 'pga', 'yes'],
     ['2018-10-22 19:13:20', 'lry', 'no']]
df = pd.DataFrame(data=d, columns=['date', 'user', 'answer'])
df['date'] = pd.to_datetime(df['date'])
gr = df.groupby(pd.Grouper(key='date',freq='W'))
for name, group in gr:
    print(' ', name)
    if len(group) > 0:
        print(group)

请注意,组 key ( name ) 是 结尾 一周的日期,因此来自组成员的日期是 早于或等于 到上面打印的日期。

您可以通过 label='left' 更改它Grouper 的参数.

关于 Pandas 按周分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53125155/

相关文章:

mysql查询group by需要很长时间

Python Pandas - 查找具有最大聚合值的连续组

python - 多索引数据帧行替换

Python Pandas : how to add a totally new column to a data frame inside of a groupby/transform operation

MySQL分组显示零记录

mysql - 在 GROUP BY 中选择记录

grouping - 如何在slickgrid中进行多列分组?

python - 按 Python 列表中的逻辑连接优先级对操作数进行分组

python - 合并相同的数据框,以便将每一行与其他每一行进行比较

python - 分组计数。为什么每列?