复制行以准备Pandas DataFrame以进行基于日期的合并

时间:2017-04-25 20:38:14

标签: python pandas dataframe merge

我有一个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因为我走了,这看起来非常低效。)

正确的方法是什么?

3 个答案:

答案 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')

From here

如果没有,请尝试此页面获取更多灵感: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