首页 > 解决方案 > 熊猫融化但日期在一个范围内

问题描述

我有一个数据框,每行都有“从”和“直到”日期,如下例所示:

+------------+------------+---------+-----------+-----+-----+
|    From    |   Until    | Product | BaseValue | Tax | Int |
+------------+------------+---------+-----------+-----+-----+
| 01/01/2020 | 01/02/2020 | A       |       200 |  50 |  10 |
| 01/01/2020 | 01/02/2020 | B       |       500 |  15 |   5 |
| 01/01/2020 | 01/02/2020 | C       |       150 |  10 |   2 |
+------------+------------+---------+-----------+-----+-----+

但是,我需要“融化”每一行的日期,为适合“从”和“直到”之间的每个日期创建一个新行。例如,预期结果:

+------------+---------+-----------+-----+-----+
|    Date    | Product | BaseValue | Tax | Int |
+------------+---------+-----------+-----+-----+
| 01/01/2020 | A       | 200       | 50  | 10  |
| 02/01/2020 | A       | 200       | 50  | 10  |
| 03/01/2020 | A       | 200       | 50  | 10  |
| ...        | ...     | ...       | ... | ... |
| 01/02/2020 | A       | 200       | 50  | 10  |
| 01/01/2020 | B       | 500       | 15  | 5   |
| 02/01/2020 | B       | 500       | 15  | 5   |
| 03/01/2020 | B       | 500       | 15  | 5   |
| ...        | ...     | ...       | ... | ... |
| 01/02/2020 | B       | 500       | 15  | 5   |
+------------+---------+-----------+-----+-----+

这样做最尖锐的方法是什么?

标签: pythonpandas

解决方案


我假设FromUntil列是日期时间类型。

定义以下函数以将每一行转换为 DataFrame,该行在每个日期“增殖”:

def proc(row):
    dct = row.loc['Product':'Int'].to_dict()
    return pd.DataFrame({'Date': pd.date_range(row.From, row.Until)}).assign(**dct)

然后将其应用于每一行并连接结果:

result = pd.concat(df.apply(proc, axis=1).tolist(), ignore_index=True)

推荐阅读