【发布时间】:2021-02-17 15:22:58
【问题描述】:
我需要检查销售数据的 2 个条件:
- 在特定年份出售
- 在特定天数出售,金额 > 0
数据框df:
date | id | qual | amount
2020-09-01 | 123 | A | 100
2020-09-02 | 123 | A | 0
2020-09-03 | 123 | A | 90
2020-09-04 | 123 | A | 80
2020-09-01 | 123 | B | 8
2020-09-02 | 123 | B | 6
2020-09-03 | 123 | B | 4
2020-09-04 | 123 | B | 2
2021-02-01 | 123 | B | 18
2020-02-01 | 456 | A | 96
2021-02-02 | 456 | A | 90
2021-01-01 | 789 | A | 30
2021-01-02 | 789 | A | 31
2021-01-03 | 789 | A | 32
2021-01-04 | 789 | A | 29
数据框有 10_000 个 ID,每个 ID 大约有 1000 个日期,每个 ID 有 1 或 2 个质量(质量)级别。
需要对ID + qual level的每个组合进行检查。
检查每个 ID + Qual 后,我想过滤我的数据框,使其仅包含通过该检查的 ID + Qual 组合。
ID:123,质量:A
- 有 2020 年和 2021 年的销售量❌
- 至少有 4 行数量 > 0 ❌
- ->不通过
ID:123,质量:B
- 有 2020 年和 2021 年的销售量✅
- 至少有 4 行数量 > 0 ✅
- -> 确实通过了
ID:456,质量:A
- 有 2020 年和 2021 年的销售量✅
- 至少有 4 行数量 > 0 ❌
- ->不通过
ID:789,质量:A
- 有 2020 年和 2021 年的销售量❌
- 至少有 4 行数量 > 0 ✅
- ->不通过
因此结果应如下所示:
date | id | qual | amount
2020-09-01 | 123 | B | 8
2020-09-02 | 123 | B | 6
2020-09-03 | 123 | B | 4
2020-09-04 | 123 | B | 2
2021-02-01 | 123 | B | 18
到目前为止我的代码:
required_sales_years= [2020, 2021]
required_sales_days = 4
has_required_sales = []
for id in df["id"].unique().tolist():
for qual in df["qual"].unique().tolist():
temp = df.query(
"id== @id and qual == @qual and amount > 0"
)
sales_years = temp["date"].dt.year.unique().tolist()
check_sales_year = all(item in sales_years for item in required_sales_years)
check_sales_days = len(temp.index) >= required_sales_days
if check_sales_year and check_sales_days:
has_required_sales.append((id, qual))
我该怎么做?
【问题讨论】: