Python 基于索引和日期的数据帧合并

Python 基于索引和日期的数据帧合并,python,pandas,dataframe,Python,Pandas,Dataframe,我想合并/连接/。。。2个数据帧,这样我就可以得到下面的第3个数据帧(第一个数据帧中的每个股票代码/日期组合的第2个数据帧中的第1个数据帧+var2): 第一数据帧: dict1 = [{'date': '2016-11-29','var1': 'x1'}, { 'date': '2016-11-29','var1': 'x2'}, { 'date': '2016-11-29','var1': 'x3'}, {'date': '2016-11-29','var1': 'x4'}, {'

我想合并/连接/。。。2个数据帧,这样我就可以得到下面的第3个数据帧(第一个数据帧中的每个股票代码/日期组合的第2个数据帧中的第1个数据帧+var2):

第一数据帧:

 dict1 = [{'date': '2016-11-29','var1': 'x1'},
 { 'date': '2016-11-29','var1': 'x2'},
 { 'date': '2016-11-29','var1': 'x3'},
 {'date': '2016-11-29','var1': 'x4'},
 {'date': '2016-11-30','var1': 'x5'},
 {'date': '2016-11-30','var1': 'x6'}]
 df1 = pd.DataFrame(dict1, index=['ge','jpm','fb', 'msft','ge','jpm'])
 dict2 = [{'date': '2016-11-29','var2': 'y1'},
 { 'date': '2016-11-29','var2': 'y2'},
 { 'date': '2016-11-29','var2': 'y3'},
 {'date': '2016-11-29','var2': 'y4'},
 {'date': '2016-11-30','var2': 'y5'},
 {'date': '2016-11-30','var2': 'y6'},
 {'date': '2016-11-30','var2': 'y7'},
 {'date': '2016-11-30','var2': 'y8'}]
  df2 = pd.DataFrame(dict2, index=['aapl', 'msft','ge','jpm','aapl', 'msft','ge','jpm'])
  dict3 = [{'date': '2016-11-29','var1': 'x1','var2': 'y3'},
 { 'date': '2016-11-29','var1': 'x2','var2': 'y4'},
 { 'date': '2016-11-29','var1': 'x3','var2': 'NaN'},
 {'date': '2016-11-29','var1': 'x4','var2': 'y2'},
 {'date': '2016-11-30','var1': 'x5','var2': 'y7'},
 {'date': '2016-11-30','var1': 'x6','var2': 'y8'}]
 df3 = pd.DataFrame(dict3, index=['ge','jpm','fb', 'msft','ge','jpm'])
第二数据帧:

 dict1 = [{'date': '2016-11-29','var1': 'x1'},
 { 'date': '2016-11-29','var1': 'x2'},
 { 'date': '2016-11-29','var1': 'x3'},
 {'date': '2016-11-29','var1': 'x4'},
 {'date': '2016-11-30','var1': 'x5'},
 {'date': '2016-11-30','var1': 'x6'}]
 df1 = pd.DataFrame(dict1, index=['ge','jpm','fb', 'msft','ge','jpm'])
 dict2 = [{'date': '2016-11-29','var2': 'y1'},
 { 'date': '2016-11-29','var2': 'y2'},
 { 'date': '2016-11-29','var2': 'y3'},
 {'date': '2016-11-29','var2': 'y4'},
 {'date': '2016-11-30','var2': 'y5'},
 {'date': '2016-11-30','var2': 'y6'},
 {'date': '2016-11-30','var2': 'y7'},
 {'date': '2016-11-30','var2': 'y8'}]
  df2 = pd.DataFrame(dict2, index=['aapl', 'msft','ge','jpm','aapl', 'msft','ge','jpm'])
  dict3 = [{'date': '2016-11-29','var1': 'x1','var2': 'y3'},
 { 'date': '2016-11-29','var1': 'x2','var2': 'y4'},
 { 'date': '2016-11-29','var1': 'x3','var2': 'NaN'},
 {'date': '2016-11-29','var1': 'x4','var2': 'y2'},
 {'date': '2016-11-30','var1': 'x5','var2': 'y7'},
 {'date': '2016-11-30','var1': 'x6','var2': 'y8'}]
 df3 = pd.DataFrame(dict3, index=['ge','jpm','fb', 'msft','ge','jpm'])
第三(目标)数据帧:

 dict1 = [{'date': '2016-11-29','var1': 'x1'},
 { 'date': '2016-11-29','var1': 'x2'},
 { 'date': '2016-11-29','var1': 'x3'},
 {'date': '2016-11-29','var1': 'x4'},
 {'date': '2016-11-30','var1': 'x5'},
 {'date': '2016-11-30','var1': 'x6'}]
 df1 = pd.DataFrame(dict1, index=['ge','jpm','fb', 'msft','ge','jpm'])
 dict2 = [{'date': '2016-11-29','var2': 'y1'},
 { 'date': '2016-11-29','var2': 'y2'},
 { 'date': '2016-11-29','var2': 'y3'},
 {'date': '2016-11-29','var2': 'y4'},
 {'date': '2016-11-30','var2': 'y5'},
 {'date': '2016-11-30','var2': 'y6'},
 {'date': '2016-11-30','var2': 'y7'},
 {'date': '2016-11-30','var2': 'y8'}]
  df2 = pd.DataFrame(dict2, index=['aapl', 'msft','ge','jpm','aapl', 'msft','ge','jpm'])
  dict3 = [{'date': '2016-11-29','var1': 'x1','var2': 'y3'},
 { 'date': '2016-11-29','var1': 'x2','var2': 'y4'},
 { 'date': '2016-11-29','var1': 'x3','var2': 'NaN'},
 {'date': '2016-11-29','var1': 'x4','var2': 'y2'},
 {'date': '2016-11-30','var1': 'x5','var2': 'y7'},
 {'date': '2016-11-30','var1': 'x6','var2': 'y8'}]
 df3 = pd.DataFrame(dict3, index=['ge','jpm','fb', 'msft','ge','jpm'])

请注意,数据帧没有对齐,因此合并应确保索引和日期相同。也就是说,索引和日期是唯一标识符。例如,在第三个数据框中,您可以看到第一行需要从日期“2016-11-29”开始的股票代码“ge”。此外,如前所述,我只需要df1中的数据,df2中除此之外的任何内容都不感兴趣(即附加日期或标记不相关)。

您可以重置索引,在索引列和日期列上合并,并恢复索引:

df1.reset_index().merge(df2.reset_index(), 
                        on=['index', 'date'], how='left')\
                 .set_index('index')
#             date var1 var2
#index                      
#ge     2016-11-29   x1   y3
#jpm    2016-11-29   x2   y4
#fb     2016-11-29   x3  NaN
#msft   2016-11-29   x4   y2
#ge     2016-11-30   x5   y7
#jpm    2016-11-30   x6   y8

您可以重置索引,合并索引列和日期列,并恢复索引:

df1.reset_index().merge(df2.reset_index(), 
                        on=['index', 'date'], how='left')\
                 .set_index('index')
#             date var1 var2
#index                      
#ge     2016-11-29   x1   y3
#jpm    2016-11-29   x2   y4
#fb     2016-11-29   x3  NaN
#msft   2016-11-29   x4   y2
#ge     2016-11-30   x5   y7
#jpm    2016-11-30   x6   y8

你试了什么没用?我甚至不知道从哪里开始。我的第一个方法是合并,但据我所知,它使用一个唯一的标识符。我想到的另一个方法是蛮力方法。通过运行循环,在第二个数据帧中搜索正确的值,但听起来不太像python。你尝试了什么不起作用?我甚至不知道从哪里开始。我的第一个方法是合并,但据我所知,它使用一个唯一的标识符。我想到的另一个方法是蛮力方法。通过运行循环,在第二个数据帧中搜索正确的值,但听起来不太像python。哇,我没有意识到merge可以做到这一点,非常感谢您的帮助。为了确保我理解正确,为什么必须重置两个数据帧的索引?你不能合并实际的索引和日期吗?或者on=只接受变量吗?您只能在索引或列上合并,但不能混合和匹配。啊,我明白了。非常感谢您的解释和上述解决方案。对我来说非常好!!哇,我没有意识到合并可以做到这一点,非常感谢你的帮助。为了确保我理解正确,为什么必须重置两个数据帧的索引?你不能合并实际的索引和日期吗?或者on=只接受变量吗?您只能在索引或列上合并,但不能混合和匹配。啊,我明白了。非常感谢您的解释和上述解决方案。对我来说非常好!!