Python: как объединить два кадра данных на основе двух столбцов с одной стороны и одного столбца с другой? - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть два кадра данных df1 и df2

df1   
      Name1  Name2
0     John   Jack
1     Eva    Tom
2     Eva    Sara
3     Carl   Sam
4     Sam    Erin

df2   Name    Money
0     John     40
1     Eva      20
2     Jack     10
3     Tom      80
4     Sara     34
5     Carl     77
6     Erin     12 

Я хотел бы объединить два кадра данных и получить:

df1   
      Name1  Name2   Money1   Money2
0     John   Jack     40       10
1     Eva    Tom      20       80
2     Eva    Sara     20       34
3     Carl   Sam      77       NaN
4     Sam    Erin     NaN      12

это то, что я делаю, но я думаю, что это не лучшее решение:

df1 = pd.merge(df1, df2, right_on='Name1', left_on='Name')
df1.columns = ['Name1', 'Name2', 'Money1']
df1 = pd.merge(df1, df2, right_on='Name2', left_on='Name')
df1.columns = ['Name1', 'Name2', 'Money1', 'Money2']

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Вы можете использовать index matching без необходимости apply

assign

df = df.set_index('Name1').assign(Money_1=df2.set_index('Name').Money).reset_index().set_index('Name2').assign(Money_2=df2.set_index('Name').Money).reset_index()

Который на самом деле однострочный, но довольно большой. Другой вариант - явно написать строки:


loc

df = df.set_index('Name1')
df.loc[:, 'Money_1'] = df2.set_index('Name').Money

df = df.reset_index().set_index('Name2')
df.loc[:, 'Money_2'] = df2.set_index('Name').Money

df.reset_index()

Оба выхода

    Name1   Name2   Money_1 Money_2
0   John    Jack    40.0    10.0
1   Eva     Tom     20.0    80.0
2   Eva     Sara    20.0    34.0
3   Carl    Sam     77.0    NaN
4   Sam     Erin    NaN     12.0
0 голосов
/ 06 сентября 2018

Использование карты с приложением

df1[['Money1','Money2']]=df1.apply(lambda x : x.map(df2.set_index('Name').Money))
df1
Out[293]: 
  Name1 Name2  Money1  Money2
0  John  Jack    40.0    10.0
1   Eva   Tom    20.0    80.0
2   Eva  Sara    20.0    34.0
3  Carl   Sam    77.0     NaN
4   Sam  Erin     NaN    12.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...