Python 复制行以为基于日期的合并准备数据帧
我有一个包含数百万行项目/组的数据库,称为项目: 我需要准备要与一个名为forecast的df合并的项目,该df如下所示:Python 复制行以为基于日期的合并准备数据帧,python,pandas,dataframe,merge,Python,Pandas,Dataframe,Merge,我有一个包含数百万行项目/组的数据库,称为项目: 我需要准备要与一个名为forecast的df合并的项目,该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 Item Group Month 0001 A 5 0001 A 6
Item Group Month Forecast
0001 A 5 15
0001 A 6 16
0001 A 7 13
0002 A 5 60
0002 A 7 65
Item Group Month
0001 A 5
0001 A 6
0001 A 7
0002 A 5
0002 A 6
0002 A 7
...
我的合并将类似于:
items.mergeforecast,on=['Item','Group','Month']
所以我的问题是准备项目,使其看起来像这样:
Item Group Month Forecast
0001 A 5 15
0001 A 6 16
0001 A 7 13
0002 A 5 60
0002 A 7 65
Item Group Month
0001 A 5
0001 A 6
0001 A 7
0002 A 5
0002 A 6
0002 A 7
...
因此,对于给定的一组月份,例如5、6、7,每个项目/组组合都有lenmonths行,无论是否有预测
预测中该项目/组/月份的数据
需要保留订单,例如,给定项目/行的三个月需要分组在一起,而不是仅附加到末尾的副本,并且项目需要保持有序
到目前为止,我一直在寻找堆栈作为一种可能的选择,但除了循环通过df,在我去的时候将第*2行附加到一个新的空df之外,我还没有得到任何工作,这看起来效率非常低
正确的方法是什么?尝试外部合并
pd.merge(items, forecast, on=['Item', 'Group'], how='outer')
如果没有,请尝试此页面以获得更多灵感:从以下数据框开始,在列项和组未设置为索引的情况下,我有以下内容:
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
合并将包含哪些新信息?没有预测的项目/组/月份的NaN?@Charlie Yes。但是我简化了数据帧。items和forecast还有其他列,因此真正的目标是将forecast中的“forecast”信息带到items中,并为所有缺少的forecast创建NAN。此外,项目是预测的超集,因此直接在预测上执行op不会为所有项目创建它。这并不能解决在项目中创建包含所有可能项目/组/月组合的合理月份列的问题。这是这里的问题,而不是一旦合并完成后如何合并。如果我做得正确,应该在合并中添加月份……我认为。我更新了答案以删除“月”键。转到链接中的外部合并,看看这是否符合您的要求。这基本上就是我最终得到的结果。唯一的问题是,它没有保留项目的原始顺序,它们在实际DF中实际上没有排序顺序。为了解决这个问题,我只是将索引保留为一列,然后根据它进行排序。不知道为什么我认为它比这更复杂。这是我想象中的巧妙答案!我想我会坚持另一个,尽管它可能效率较低,但b/c更明确地说明发生了什么。@SeanKramer这当然是你的选择。。。希望这仍然有用:-当然有用!repeat和assign函数都是我以前没有遇到过的,我可能已经使用过很多次了。
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