【发布时间】:2021-05-14 04:53:49
【问题描述】:
我有一个这样的数据集:
| date | company_id | product_id | sales |
|---|---|---|---|
| 2020-11-30 | 001 | 1 | 200 |
| 2020-11-30 | 002 | 2 | 150 |
| 2020-12-30 | 001 | 1 | 50 |
| 2020-12-30 | 001 | 2 | 400 |
| 2020-12-30 | 002 | 3 | 300 |
| 2020-12-30 | 001 | 4 | 350 |
| 2021-01-30 | 002 | 1 | 600 |
| 2021-01-30 | 001 | 2 | 400 |
| 2021-01-30 | 002 | 4 | 100 |
| 2021-01-30 | 001 | 5 | 50 |
| 2021-01-30 | 002 | 6 | 35 |
| 2021-01-30 | 001 | 7 | 400 |
我需要通过 company_id 计算出今天和前一天的销售额之间的差异,这可以通过将其转换为 pandas 数据框、按 company_id 分组并进行轮班来轻松解决。但是,如果销售额为 0,则不报告产品,这意味着当我换班时,我得到 0 来表示变化,而不是增加/减少。
我尝试了下面的方法,它基本上是通过 company_id 获取所有产品的列表,如果没有报告他们用 0 添加它们,但这似乎不能正常工作,并且需要永远运行。
company_ids= set(df['company_id'].tolist())
for company_id company_ids:
full_prod_list= set(df[df['company_id'] == company_id]['product_id'].tolist())
for date in set(df[df['company_id'] == company_id]['date'].tolist()):
date_prod_list = set(df[(df['product_id'] == product_id) & (df['date'] == date)]['product_id'].tolist())
diff = [x for x in full_prod_list if x not in date_prod_list]
for i in diff:
df.loc[len(df)]=[date, company_id, i, 0]
例如,11 月应如下所示:
| date | company_id | product_id | sales |
|---|---|---|---|
| 2020-11-30 | 001 | 1 | 200 |
| 2020-11-30 | 001 | 2 | 0 |
| 2020-11-30 | 001 | 4 | 0 |
| 2020-11-30 | 001 | 5 | 0 |
| 2020-11-30 | 001 | 7 | 0 |
| 2020-11-30 | 002 | 1 | 0 |
| 2020-11-30 | 002 | 2 | 150 |
| 2020-11-30 | 002 | 3 | 0 |
| 2020-11-30 | 002 | 4 | 0 |
| 2020-11-30 | 002 | 6 | 0 |
谢谢
【问题讨论】:
-
请发布您的预期输出。
-
@MayankPorwal,在底部,格式有点乱,但应该是可读的
-
您是说要转换原始 df 以便它在每个日期包含每个公司和产品和销售条目的唯一行,然后使用转换后的 df,按天分组并确定与前一天的销售额差异?
标签: python-3.x pandas