python - Pandas Groupby 使用时间频率
问题描述
我的问题是关于熊猫数据框的 groupby 。示例数据集如下所示:
cust_id | date | category
A0001 | 20/02/2016 | cat1
A0001 | 24/02/2016 | cat2
A0001 | 02/03/2016 | cat3
A0002 | 03/04/2015 | cat2
现在我想对 cust_id 进行分组,然后查找彼此相隔 30 天内发生的事件并为这些事件编译类别列表。到目前为止,我想到的是按以下方式使用 pd.grouper 。
df.groupby(['cust_id', pd.Grouper(key='date', freq='30D')])['category'].apply(list)
但这并不是将 [cat1, cat2, cat3] 放在 A0001 的同一个列表中。任何关于我做错了什么或如何去做我需要做的事情的帮助将不胜感激。
我想要的结果应该是这样的:
A0001 | [cat1, cat2, cat3]
A0002 | [cat2]
提前致谢
编辑:
按照温的回答,我尝试了这个最小示例并且它适用于这个最小示例,我不适合提供一个不具有代表性的最小示例。可以使用此示例为 0.20.3 和 0.23.0 版本的 pandas 重新创建这一点。
cust_id date category
0 A0001 2015-02-02 cat5
1 A0002 2015-02-03 cat1
2 A0001 2016-02-20 cat1
3 A0001 2016-02-24 cat2
4 A0001 2016-03-02 cat3
5 A0003 2016-09-09 cat2
6 A0003 2016-08-21 cat5
我得到的答案是:
cust_id
A0001 [cat5]
A0001 [cat1, cat2]
A0001 [cat3]
A0002 [cat1]
A0003 [cat5]
Name: category, dtype: object
我为最初的困惑道歉!
解决方案
你的代码对我有用
df.date=pd.to_datetime(df.date)
df.groupby(['cust_id', pd.Grouper(key='date', freq='30D')])['category'].apply(list).reset_index(level=1,drop=True)
Out[215]:
cust_id
A0001 [ cat1, cat2, cat3]
A0002 [ cat2]
Name: category, dtype: object
推荐阅读
- java - 从 SQL Server 存储过程中引发 Java SQLException?
- vue.js - 如何在 Vuex 中同时使用非命名空间模块和命名空间模块
- r - 将列名转换为 R 中的列表
- flutter - 在 Flutter 中使用 SharedPreferences 和 Provider 的正确方法是什么?
- jsp - Jsp scriplet 有效,而 jstl 无效
- excel - 将类似部分名称的选项卡复制到另一个工作簿
- git - 是否可以在 maven frontend-maven-plugin 中配置 npm 使用的 git 命令来拉取依赖项?
- c++ - 如何配置 VSCode 任务以在 Linux 上编译多个文件?
- node.js - Router.use() 需要一个中间件函数,但未定义 socket.io 和 mocha
- python - 计算特定 dataframe.iloc 中的元素