从具有开始日期和结束日期的数据框列生成日期范围

Ser*_*rin 1 python bigdata dataframe pandas

我有以下 Pandas 数据框:

店铺 物品 价格 开始日期有效 有效结束日期
店铺1 项目1 100.00 2019-01-01 2019-01-06
店铺1 项目1 120.00 2019-01-07 2019-01-10
店铺1 项目2 80.00 2018-12-31 2019-01-03
店铺1 项目2 150.00 2019-01-04 2019-01-06
商店2 项目1 105.00 2019-01-01 2019-01-06
商店2 项目1 130.00 2019-01-07 2019-01-10
商店2 项目2 85.00 2018-12-31 2019-01-03
商店2 项目2 145.00 2019-01-04 2019-01-06

我需要得到下表作为输出:

店铺 物品 日期 价格
店铺1 项目1 2019-01-01 100.00
店铺1 项目1 2019-01-02 100.00
店铺1 项目1 2019-01-03 100.00
店铺1 项目1 2019-01-04 100.00
店铺1 项目1 2019-01-05 100.00
店铺1 项目1 2019-01-06 100.00
店铺1 项目1 2019-01-07 120.00
店铺1 项目1 2019-01-08 120.00
店铺1 项目1 2019-01-09 120.00
店铺1 项目1 2019-01-10 120.00
店铺1 项目2 2018-12-31 80.00
店铺1 项目2 2019-01-01 80.00
店铺1 项目2 2019-01-02 80.00
店铺1 项目2 2019-01-03 80.00
店铺1 项目2 2019-01-04 80.00
店铺1 项目2 2019-01-05 80.00
店铺1 项目2 2019-01-06 80.00

适用于所有商店/商品组合。问题是源数据帧非常大(大约1亿行),如此简单的df.groupby(['shop', 'item']).apply(...)看起来不适合我。如何以最快的方式产生所需的输出?

Sea*_*ean 7

由于您的数据集很大,您必须使用 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
Run Code Online (Sandbox Code Playgroud)

list(map())比其他方式快得多,例如 df.apply()在 上axis=1。速度可以提高 3 倍到 4 倍。因此,适合您的使用条件。您可以参考这篇文章,了解有关应用函数的各种方法的系统性能(执行时间)比较的更多信息。