【发布时间】:2020-10-15 13:51:14
【问题描述】:
我有一个包含许多产品 ID 和 iso_codes 的大表:总共 200 万行。所以答案应该(如果可能的话)也考虑到内存问题,我有 16 GB 内存。
我想查看对于每个 (id, iso_code) 组合,行中的 buy_date 之前返回的商品数量是多少(如此累积),但是有一个陷阱:
我只想计算return_date在我正在查看的buy_date之前的先前销售发生的退货。
我添加了 column items_returned 作为示例:这是应该计算的列。
思路如下:
在销售的那一刻,我只能计算已经发生的退货,而不是将来会发生的退货。
我尝试了df.groupby(['id', 'iso_code']).transform(np.cumsum) 和.transform(lambda x: only count returns that happened before my buy_date) 的组合,但不知道如何在应用这些特殊条件的情况下执行.groupby.transform(np.cumsum)。
关于已购买商品的类似问题,我只计算小于我的购买日期的天数的累计商品。
希望你能帮助我。
结果表示例:
+-------+------+------------+----------+------------+---------------+----------------+------------------+
| row | id | iso_code | return | buy_date | return_date | items_bought | items_returned |
|-------+------+------------+----------+------------+---------------+----------------+------------------|
| 0 | 177 | DE | 1 | 2019-05-16 | 2019-05-24 | 0 | 0 |
| 1 | 177 | DE | 1 | 2019-05-29 | 2019-06-03 | 1 | 1 |
| 2 | 177 | DE | 1 | 2019-10-27 | 2019-11-06 | 2 | 2 |
| 3 | 177 | DE | 0 | 2019-11-06 | None | 3 | 2 |
| 4 | 177 | DE | 1 | 2019-11-18 | 2019-11-28 | 4 | 3 |
| 5 | 177 | DE | 1 | 2019-11-21 | 2019-12-11 | 5 | 3 |
| 6 | 177 | DE | 1 | 2019-11-25 | 2019-12-06 | 6 | 3 |
| 7 | 177 | DE | 0 | 2019-11-30 | None | 7 | 4 |
| 8 | 177 | DE | 1 | 2020-04-30 | 2020-05-27 | 8 | 6 |
| 9 | 177 | DE | 1 | 2020-04-30 | 2020-09-18 | 8 | 6 |
+-------+------+------------+----------+------------+---------------+----------------+------------------+
示例代码:
import pandas as pd
from io import StringIO
df_text = """
row id iso_code return buy_date return_date
0 177 DE 1 2019-05-16 2019-05-24
1 177 DE 1 2019-05-29 2019-06-03
2 177 DE 1 2019-10-27 2019-11-06
3 177 DE 0 2019-11-06 None
4 177 DE 1 2019-11-18 2019-11-28
5 177 DE 1 2019-11-21 2019-12-11
6 177 DE 1 2019-11-25 2019-12-06
7 177 DE 0 2019-11-30 None
8 177 DE 1 2020-04-30 2020-05-27
9 177 DE 1 2020-04-30 2020-09-18
"""
df = pd.read_csv(StringIO(df_text), sep='\t', index_col=0)
df['items_bought'] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 8]
df['items_returned'] = [0, 1, 2, 2, 3, 3, 3, 4, 6, 6]
【问题讨论】:
标签: python pandas pandas-groupby