python - 使用 pandas python 将 2 个 groupby 输出与 lambda 组合
问题描述
表(df):
customer_id Order_date
1 2015-01-16
1 2015-01-19
2 2014-12-21
2 2015-01-10
1 2015-01-10
3 2018-01-18
3 2017-03-04
4 2019-11-05
4 2010-01-01
3 2019-02-03
3 2019-01-01
3 2018-01-01
我想要的输出:
使用 groupby 为每个客户 ID 提取 order_dates 数量(一个人至少有 3 笔交易)的代码,我还需要说最近的交易日期。
Customer_id No_order_date Most recent order date
1 3 2015-01-19
3 5 2019-02-03
到目前为止尝试的代码:
freq = 3
df.groupby('customer_id')['order_date'].nunique().loc[lambda x:
x>=freq].reset_index().rename(columns={'order_date':'No_Order_Dates'})
Customer_id No_Order_Dates
1 3
3 5
df.groupby('customer_id')['order_date'].max().reset_index().rename(columns=
{'order_date':'Most recent order Date'})
Customer_id Most recent order date
1 2015-01-19
3 2019-02-03
如何组合两个 groupby 输出?我需要两个都在一个表中(有没有一种方法可以在不使用连接或合并的情况下加入,或者我必须只使用连接/合并)
解决方案
.loc[]
您可以在 groupby 之后使用相同的命名聚合:
(df.groupby('customer_id').agg(No_transactions=('Order_date','nunique'),
Most_recent_order_date = ('Order_date', 'max'))
.loc[lambda x: x['No_transactions']>=3])
或查询:
(df.groupby('customer_id').agg(No_transactions=('Order_date','nunique'),
Most_recent_order_date = ('Order_date', 'max'))
.query("No_transactions>=3"))
No_transactions Most_recent_order_date
customer_id
1 3 2015-01-19
3 5 2019-02-03
推荐阅读
- ios - Flutter didChangeAppLifecycleState 在 iOS 中停止工作
- python - 计算子字符串中的元音和辅音
- go - 使用 VERSION beego 回滚特定迁移
- javascript - 在 Node.js 中使用 sqlite3 未定义 lastID
- ansible - Ansible 提取 GCP 磁盘类型
- regex - 无法使用 Sublime Text 选择性地应用正则表达式的替换文本
- google-apps-script - 如何为使用 appendRow 写入数据的多个复选框制作更好的 Google 表格循环脚本
- swagger - 我创建的 JHipster 实体仅在 Swagger API ui 中公开了 GET 操作
- css - 将不同的 CSS 样式表划分为不同的元素
- amazon-web-services - 使用 aws 服务替代 Debezium