我有以下熊猫数据帧:
商店 | 商品 | 价格 | start_date_valid | end_date_valid |
---|---|---|---|---|
商店 | 1项目1 | 100.00 | 2019-01-012019-01-06 | |
商店 | 1项目1 | 120.00 | 2019-01-072019-01-10 | |
商店1 | 项目2 | 80.00 | 2018-12-31 | 2019-01-03 |
商店1 | 项目2 | 150.00 | 2019-01-042019-01-06 | |
商店2 | 项目1 | 105.00 | 2019-01-012019-01-06 | |
商店2 | 项目1 | 130.00 | 2019-01-072019-01-10 | |
商店2 | item2 | 85.00 | 2018-12-31 | 2019-01-03 |
商店 | 2项目2 | 145.00 | 2019-01-042019-01-06 |
由于您的数据集很大,因此您必须使用更有效的操作来利用 pandas 矢量化操作。 您可以将list(map())
与pd.date_range()
和df.explode()
一起使用,如下所示:
df['date'] = list(map(lambda x, y: pd.date_range(start=x, end=y),
df['start_date_valid'],
df['end_date_valid']))
df = (df.explode('date')
.drop(['start_date_valid', 'end_date_valid'], axis=1))
print(df)
shop item price date
0 shop1 item1 100.0 2019-01-01
0 shop1 item1 100.0 2019-01-02
0 shop1 item1 100.0 2019-01-03
0 shop1 item1 100.0 2019-01-04
0 shop1 item1 100.0 2019-01-05
0 shop1 item1 100.0 2019-01-06
1 shop1 item1 120.0 2019-01-07
1 shop1 item1 120.0 2019-01-08
1 shop1 item1 120.0 2019-01-09
1 shop1 item1 120.0 2019-01-10
2 shop1 item2 80.0 2018-12-31
2 shop1 item2 80.0 2019-01-01
2 shop1 item2 80.0 2019-01-02
2 shop1 item2 80.0 2019-01-03
3 shop1 item2 150.0 2019-01-04
3 shop1 item2 150.0 2019-01-05
3 shop1 item2 150.0 2019-01-06
4 shop2 item1 105.0 2019-01-01
4 shop2 item1 105.0 2019-01-02
4 shop2 item1 105.0 2019-01-03
4 shop2 item1 105.0 2019-01-04
4 shop2 item1 105.0 2019-01-05
4 shop2 item1 105.0 2019-01-06
5 shop2 item1 130.0 2019-01-07
5 shop2 item1 130.0 2019-01-08
5 shop2 item1 130.0 2019-01-09
5 shop2 item1 130.0 2019-01-10
6 shop2 item2 85.0 2018-12-31
6 shop2 item2 85.0 2019-01-01
6 shop2 item2 85.0 2019-01-02
6 shop2 item2 85.0 2019-01-03
7 shop2 item2 145.0 2019-01-04
7 shop2 item2 145.0 2019-01-05
7 shop2 item2 145.0 2019-01-06
list(map())
比其他方法快得多,例如df.apply()
axis=1
.速度可能快 3 倍 ~ 4 倍。 因此,适合您的使用条件。 您可以参考这篇文章,了解有关应用函数的各种方法的系统性能(执行时间)比较的更多信息。
很好,与下面的解决方案相同。
df["daterange"] = df.apply(lambda x: pd.date_range(x.start_date, x.end_date), axis=1) df = df.explode('daterange').reset_index(drop=True) print (df)