簡體   English   中英

Python:如何基於從一側到另一側的兩列合並兩個數據框?

[英]Python: how to merge two dataframes based on two columns from one side and one column to the other?

我有兩個數據df1df2

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

結合使用地圖和套用

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

您可以使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM