python - 熊猫融化但日期在一个范围内
问题描述
我有一个数据框,每行都有“从”和“直到”日期,如下例所示:
+------------+------------+---------+-----------+-----+-----+
| 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 |
+------------+---------+-----------+-----+-----+
这样做最尖锐的方法是什么?
解决方案
我假设From和Until列是日期时间类型。
定义以下函数以将每一行转换为 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)
推荐阅读
- jquery - Angular 6的Bootstrap 4轮播不稳定行为
- microsoft-graph-api - MS Graph 中的错误?尽管有权限、同意和委托,但通过 Microsoft Graph 拒绝访问:/users/{userID}/mailfolders/inbox/messagerules。
- java - 如何使用任何 CircularLayoutManager 实现循环 RecylerView / ListView
- ios - 在 AFNetwroking 上允许连接无效 SSL 固定
- python - 如何在 Python 中引用标签之间的 XML 值
- c# - 将对象实例化为属性与大多数方法中的对象实例化
- css - 覆盖Angular中的css类
- sql - 将两列合二为一
- python - 用 Hy 中的索引替换列表/字典元素
- angular - 如何在 Bootstrap 模态体内实现 col-lg-10 col-lg-2?