【问题标题】:Add column values to a dataframe based on date range of another dataframe根据另一个数据框的日期范围将列值添加到数据框
【发布时间】:2020-11-19 16:29:46
【问题描述】:

我有 2 个数据框:

带有销售数据的df1:

key | date       | sales
1   | 2020-10-16 | 100
1   | 2020-10-17 | 150
1   | 2020-10-19 | 180

2   | 2019-11-01 | 26
2   | 2019-11-02 | 27
2   | 2019-11-05 | 28

带有广告活动数据的df2:

key | sale_start | sale_end   | stock
1   | 2020-10-16 | 2020-10-18 | 1000
1   | 2020-10-17 | 2020-10-20 | 1500
1   | 2020-10-20 | 2020-10-31 | 1800

2   | 2019-11-01 | 2019-11-03 | 260
2   | 2019-11-03 | 2019-11-05 | 270
2   | 2019-11-05 | 2019-11-15 | 280
  • 我需要将“df2”的“库存”编号转换为“df1”,以便“df1”的每个销售日都有库存编号作为列。
  • 那么我需要当天的已售产品库存百分比。

有一些重叠的广告系列,因此需要将这些重叠天的“库存”相加。

最终结果应该是:

key | date       | sales | stock              | sales_stock_%
1   | 2020-10-16 | 100   | 1000               | 10
1   | 2020-10-17 | 150   | 2500 (1000 + 1500) | 6
1   | 2020-10-19 | 180   | 1500               | 12

2   | 2019-11-01 | 26    | 260                | 10
2   | 2019-11-02 | 27    | 260                | 10.38461538461538
2   | 2019-11-05 | 28    | 550 (270 + 280)    | 5.090909090909091

最后一栏很简单,但如何将库存添加到 df1?

【问题讨论】:

  • 是 sale_start 和 sale_end 日期时间吗?日期也包括在内,那么 df1 的第一行是否涵盖所有三天?日期如何重叠?
  • sale_start 和 sale_end 都是 dtype: datetime64[ns]。 df1 的第一行仅涵盖“日期”列(此处为“2020-10-16”)中的一天,与 df1 中的所有其他行相同。重叠发生在 df2 中,例如第 1 行表示此活动的活动日期为“2020-10-16”、“2020-10-17”、“2020-10-18”,但第 2 行表示此活动从“2020-10-17”、“2020”开始-10-18”、“2020-10-19”、“2020-10-20”。因此,两个广告系列在“2020-10-17”+“2020-10-18”天重叠。

标签: python pandas join merge


【解决方案1】:

假设您仍然找不到答案并纠正@Paul Brennan 评论的内容:

for index, row in df1.iterrows():
    df1.at[index, "stock"]= df2[(df2["sale_start"] <= row["date"]) & (df2["sale_end"] >= row["date"])].sum()["stock"]

【讨论】:

    【解决方案2】:
    for index, row in df1.iterrows():
        df1.at[row.Index, 'stock'] = df2[(df2.sale_start <= row['date']) & (d2.sale_end >= row['date']).sum(axis=1).stock
    

    对不起,这不是pythonic。这是计划,对于每次销售,获取该销售的库存。库存是在销售日期可用的所有库存的总和,总和。

    【讨论】:

    • 感谢您的回答,但我收到了Series' object has no attribute 'stock?
    • 那我得到'Series' object has no attribute 'Index'? df1 和 df2 都有默认索引。在.sum( 之前缺少一个]
    猜你喜欢
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-06
    • 2023-01-21
    • 1970-01-01
    • 2018-12-29
    • 1970-01-01
    相关资源
    最近更新 更多