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(...)看起来不适合我。如何以最快的方式产生所需的输出?
由于您的数据集很大,您必须使用 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 倍。因此,适合您的使用条件。您可以参考这篇文章,了解有关应用函数的各种方法的系统性能(执行时间)比较的更多信息。
| 归档时间: |
|
| 查看次数: |
1305 次 |
| 最近记录: |