我有一个pandas df,其中包含几百万行名为items
的项目/组:
Item Group
0001 A
0002 A
0003 B
0004 A
...
我需要准备items
与名为forecast
的df合并,如下所示:
Item Group Month Forecast
0001 A 5 15
0001 A 6 16
0001 A 7 13
0002 A 5 60
0002 A 7 65
我的合并将类似于:
items.merge(forecast, on=['Item', 'Group', 'Month']
所以我的问题是让items
看起来像这样:
Item Group Month
0001 A 5
0001 A 6
0001 A 7
0002 A 5
0002 A 6
0002 A 7
...
因此,对于给定的一组月份(例如5, 6, 7
),每个项目/组合组合都有len(months)
行,无论是否有预测
forecast
中该项目/组/月的数据。
需要保留订单(例如,给定项目/行的三个月需要组合在一起,而不是仅附加到末尾的副本,并且项目需要按顺序保留。)
到目前为止,我一直在研究stack()作为一个可能的选择,但我还没有任何工作(除了循环通过df,将行* 2附加到一个新的空df因为我走了,这看起来非常低效。)
正确的方法是什么?
答案 0 :(得分:2)
months = [5, 6, 7]
idx = items.index.repeat(len(months))
months_ = months * len(items)
items_ = items.loc[idx].assign(Month=months_).reset_index(drop=True)
print(items_)
Item Group Month
0 1 A 5
1 1 A 6
2 1 A 7
3 2 A 5
4 2 A 6
5 2 A 7
6 3 B 5
7 3 B 6
8 3 B 7
9 4 A 5
10 4 A 6
11 4 A 7
forecast.merge(items_)
Item Group Month Forecast
0 1 A 5 15
1 1 A 6 16
2 1 A 7 13
3 2 A 5 60
4 2 A 7 65
答案 1 :(得分:1)
尝试外部合并
pd.merge(items, forecast, on=['Item', 'Group'], how='outer')
如果没有,请尝试此页面获取更多灵感:http://pandas.pydata.org/pandas-docs/stable/merging.html#database-style-dataframe-joining-merging
答案 2 :(得分:1)
从以下数据框开始,列Item和Group未设置为Index,我有以下内容:
Item Group
0 0001 A
1 0002 A
2 0003 B
3 0004 A
items_mod = pd.DataFrame()
for i in [5, 6, 7]:
items['Month'] = i
items_mod = items_mod.append(items)
items_mod = items_mod.sort_values('Item')
这给了我以下数据框:
Item Group Month
0 0001 A 5
0 0001 A 6
0 0001 A 7
1 0002 A 5
1 0002 A 6
1 0002 A 7
2 0003 B 5
2 0003 B 6
2 0003 B 7
3 0004 A 5
3 0004 A 6
3 0004 A 7