Слияние фреймов данных с использованием 2 идентификаторов - PullRequest
0 голосов
/ 01 декабря 2018

У меня есть 2 кадра данных, и я хотел бы добавить данные со 2-го к первому так, чтобы я получил 3-й кадр данных ниже:

1-й кадр данных:

 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)

2-й кадр данных:

 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'])

3-й кадр данных (цель):

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 голосов
/ 01 декабря 2018
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 и name df1

0 голосов
/ 01 декабря 2018

Использование 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...