我有一张大表格,包含许多产品ID和iso_codes:总共有200万行。因此,答案(如果可能的话)也应考虑内存问题,我的内存为16 GB。
我想看到对于每个(id,iso_code)组合,在购买日期之前返回的物品数量在行中累积,但有一个注意点:
我只想计算从先前销售中发生的并且退货日期早于我所查看的购买日期的退货。
我已添加items_returned列作为示例: 这是应该计算的列。 想法如下:
在销售时,我只能计算已经发生的退货,而不能计算将来会发生的退货。
我尝试了
对于购买的物品,类似的问题,我只计算小于我的购买日期的天数的物品累积。
希望你可以帮助我。 示例结果表格:
我想看到对于每个(id,iso_code)组合,在购买日期之前返回的物品数量在行中累积,但有一个注意点:
我只想计算从先前销售中发生的并且退货日期早于我所查看的购买日期的退货。
我已添加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]