首页 > 解决方案 > 如何解压数据框中的列表

问题描述

第一次发帖,python新手。

我有一个由 3 列组成的数据框:['ID', 'date', 'profit_forecast']

'ID': 是产品编号

'date': 开始日期

'profit_forecast': 一个包含367个项目的列表,每个项目是date+n的盈利预测

我正在寻找创建一个新的数据框,将 profit_forecast 中的每个项目映射到 ID 和对应的 date+n 以表示其在列表中的位置。

不知道如何开始。

提前致谢!

标签: pythonpandaslistdataframeunpack

解决方案


如果我理解正确,以下示例数据抓住了您问题的本质:

df = pd.DataFrame({'ID': [1, 2, 3], 
                   'date': pd.date_range('2019-01-01', freq='YS', periods=3), 
                   'profit_forecast': [[1, 2, 3], [4, 5], [6, 7, 8, 9]]})
df
   ID       date profit_forecast
0   1 2019-01-01       [1, 2, 3]
1   2 2020-01-01          [4, 5]
2   3 2021-01-01    [6, 7, 8, 9]

一种解决方案是确保您已升级到 pandas 0.25,然后再到explodeprofit_forecast列:

res = df.explode('profit_forecast')
res
   ID       date profit_forecast
0   1 2019-01-01               1
0   1 2019-01-01               2
0   1 2019-01-01               3
1   2 2020-01-01               4
1   2 2020-01-01               5
2   3 2021-01-01               6
2   3 2021-01-01               7
2   3 2021-01-01               8
2   3 2021-01-01               9

在这一点上,您的问题还不够清楚,您需要如何增加每个 ID 的日期。如果通过“日期+ n”您的意思是在每个ID中的每个连续日期添加一天,那么这样的事情应该可以工作:

res['date'] = res['date'] + pd.to_timedelta(res.groupby('ID').cumcount(), 'D')
res
   ID       date profit_forecast
0   1 2019-01-01               1
0   1 2019-01-02               2
0   1 2019-01-03               3
1   2 2020-01-01               4
1   2 2020-01-02               5
2   3 2021-01-01               6
2   3 2021-01-02               7
2   3 2021-01-03               8
2   3 2021-01-04               9

推荐阅读