通过使用2个标识符合并数据帧

时间:2018-12-01 06:38:24

标签: python pandas dataframe

我有2个数据框,我想将第二个数据框添加到第一个数据框,这样我就可以得到下面的第三个数据框:

第一个数据帧:

 dict = [{'name': 'aapl', 'date': '2016-11-29'},
 {'name': 'msft', 'date': '2016-11-29'},
 {'name': 'ge', 'date': '2016-11-29'},
 {'name': 'jpm', 'date': '2016-11-29'},
 {'name': 'aapl', 'date': '2016-11-30'},
 {'name': 'msft', 'date': '2016-11-30'},
 {'name': 'ge', 'date': '2016-11-30'},
 {'name': 'jpm', 'date': '2016-11-30'}]
 df1 = pd.DataFrame(dict)

第二个数据帧:

 dict = [{'2016-11-29': 'x1', '2016-11-30': 'y1'},
 {'2016-11-29': 'x2','2016-11-30': 'y2'},
 {'2016-11-29': 'x3','2016-11-30': 'y3'},
 {'2016-11-29': 'x4','2016-11-30': 'y4'}]
 df2 = pd.DataFrame(dict, index=['aapl', 'msft','ge','jpm'])

第三个数据框(目标):

dict = [{'name': 'aapl', 'date': '2016-11-29', 'df2': 'x1'},
 {'name': 'msft', 'date': '2016-11-29', 'df2': 'x2'},
 {'name': 'ge', 'date': '2016-11-29', 'df2': 'x3'},
 {'name': 'jpm', 'date': '2016-11-29', 'df2': 'x4'},
 {'name': 'aapl', 'date': '2016-11-30', 'df2': 'y1'},
 {'name': 'msft', 'date': '2016-11-30', 'df2': 'y2'},
 {'name': 'ge', 'date': '2016-11-30', 'df2': 'y3'},
 {'name': 'jpm', 'date': '2016-11-30', 'df2': 'y4'}]
 df3 = pd.DataFrame(dict)

有一种简单的方法吗?

2 个答案:

答案 0 :(得分:2)

melt之前使用merge

newdf2=df2.reset_index().melt('index').rename(columns={'index':'name','variable':'date'})

df3=df1.merge(newdf2,how='left')
df3
         date  name value
0  2016-11-29  aapl    x1
1  2016-11-29  msft    x2
2  2016-11-29    ge    x3
3  2016-11-29   jpm    x4
4  2016-11-30  aapl    y1
5  2016-11-30  msft    y2
6  2016-11-30    ge    y3
7  2016-11-30   jpm    y4

答案 1 :(得分:2)

new_df = df1.merge(df2.unstack().to_frame('df2'), left_on=['date','name'], right_index=True)

>>>new_df
         date  name df2
0  2016-11-29  aapl  x1
1  2016-11-29  msft  x2
2  2016-11-29    ge  x3
3  2016-11-29   jpm  x4
4  2016-11-30  aapl  y1
5  2016-11-30  msft  y2
6  2016-11-30    ge  y3
7  2016-11-30   jpm  y4

之所以有效,是因为当您卸货df2时:

df2.unstack().to_frame('df2')
                df2
2016-11-29 aapl  x1
           msft  x2
           ge    x3
           jpm   x4
2016-11-30 aapl  y1
           msft  y2
           ge    y3
           jpm   y4

该索引可在date的{​​{1}}和name列上合并