pandas - 查看客户是否在每个季度都有购买,然后绘制图表
问题描述
我有一个看起来像这样的数据框:
customer_id|date |sales_amount
479485 |20190120 | 500
479485 |20180320 | 200
472848 |20191020 | 100
该数据包含 2016-2019 年的交易信息。对于每个业务季度(按 3 个月分组),我想查看一个独特的客户是否进行了交易。基本上,我希望表格的 y 轴是每个唯一的 customer_id,然后表格的 x 轴是数据时间段内的 12 个季度,并带有一个布尔值,表示客户是否有交易四分之一。
最终,我想可视化这些数据,以查看每个季度在所有独特客户中的交易分布。
期望输出:
customer_id|2017- Q1 |2017- Q2|.. |2019- Q4
479485 |20190120 | 0 |.. | 1
469488 |20180320 | 0 |.. | 0
452848 |20191020 | 1 |.. | 1
我已将日期列更改为日期时间,但不确定如何分组并继续下一步。
解决方案
解决方案:
df.groupby([df['customer_id'], df['date'].apply(lambda _: pd.Period(_, 'Q'))])['sales_amount'].count().unstack().fillna(0)
输出:
date 2017Q1 2018Q1 2019Q1 2019Q4
customer_id
469471 1.0 0.0 0.0 0.0
469488 0.0 1.0 1.0 1.0
472848 0.0 0.0 0.0 1.0
479485 1.0 1.0 1.0 0.0
笔记
- 假设:(1)所有年份季度都出现在您的数据集中,(2)每个季度只有一次交易。
- 为了绕过(1),将索引设置为
date
,并重新索引缺少日期,用零值填充 nans。上述输出基于虚拟数据样本,因此仅显示了四个季度。 - 要绕过 (2),请检查
np.sign(_)
您的输出。
推荐阅读
- bash - 如何使用 FFMPEG 将输出和日志文件通过管道传输到 S3
- python - Jenkins 库在尝试通过 python 获取工作时挂起
- javascript - 如何更改配方中的成分以与用户输入相对应?
- webpack - 样式达到 10000 个字符时被切断
- swiftui - 如何显示多维数组?
- python - 从 pandas 数据框中的字符串中删除特定的 url
- eclipse - 在 Eclipse 中握手期间 SSL 握手失败远程主机关闭连接
- sqlite - 在触发器中引用其他表的列?
- javascript - Vee Validate 自定义跨字段规则,比较两个时间字符串
- vb.net - System.Data.OleDb.OleDbException:“标准表达式中的数据类型不匹配。” VB。网