Shu*_*m R 11 python join pandas
我有一个数据帧df:
id name count
1 a 10
2 b 20
3 c 30
4 d 40
5 e 50
Run Code Online (Sandbox Code Playgroud)
这里我有另一个数据帧df2:
id1 price rating
1 100 1.0
2 200 2.0
3 300 3.0
5 500 5.0
Run Code Online (Sandbox Code Playgroud)
我想在列id和id1上加入这两个数据帧(两者都是相同的).这是df3的一个例子:
id name count price rating
1 a 10 100 1.0
2 b 20 200 2.0
3 c 30 300 3.0
4 d 40 Nan Nan
5 e 50 500 5.0
Run Code Online (Sandbox Code Playgroud)
我应该使用df.merge还是pd.concat?
jez*_*ael 22
用途merge:
print (pd.merge(df1, df2, left_on='id', right_on='id1', how='left').drop('id1', axis=1))
id name count price rating
0 1 a 10 100.0 1.0
1 2 b 20 200.0 2.0
2 3 c 30 300.0 3.0
3 4 d 40 NaN NaN
4 5 e 50 500.0 5.0
Run Code Online (Sandbox Code Playgroud)
另一个解决方案是简单的重命名列:
print (pd.merge(df1, df2.rename(columns={'id1':'id'}), on='id', how='left'))
id name count price rating
0 1 a 10 100.0 1.0
1 2 b 20 200.0 2.0
2 3 c 30 300.0 3.0
3 4 d 40 NaN NaN
4 5 e 50 500.0 5.0
Run Code Online (Sandbox Code Playgroud)
如果只需要列,price最简单的是map:
df1['price'] = df1.id.map(df2.set_index('id1')['price'])
print (df1)
id name count price
0 1 a 10 100.0
1 2 b 20 200.0
2 3 c 30 300.0
3 4 d 40 NaN
4 5 e 50 500.0
Run Code Online (Sandbox Code Playgroud)
另外2个解决方案
print (pd.merge(df1, df2, left_on='id', right_on='id1', how='left')
.drop(['id1', 'rating'], axis=1))
id name count price
0 1 a 10 100.0
1 2 b 20 200.0
2 3 c 30 300.0
3 4 d 40 NaN
4 5 e 50 500.0
Run Code Online (Sandbox Code Playgroud)
print (pd.merge(df1, df2[['id1','price']], left_on='id', right_on='id1', how='left')
.drop('id1', axis=1))
id name count price
0 1 a 10 100.0
1 2 b 20 200.0
2 3 c 30 300.0
3 4 d 40 NaN
4 5 e 50 500.0
Run Code Online (Sandbox Code Playgroud)
join除非我们指定要使用的列,否则利用索引进行合并。但是,我们只能为'left'数据框指定一列而不是索引。
战略:
set_index上df2是id1join与df作为左数据框,并id作为on参数。请注意,我能有set_index('id')上df,以避免使用该on参数。但是,这使我可以将列留在数据框中,而不必稍后重新设置索引。df.join(df2.set_index('id1'), on='id')
id name count price rating
0 1 a 10 100.0 1.0
1 2 b 20 200.0 2.0
2 3 c 30 300.0 3.0
3 4 d 40 NaN NaN
4 5 e 50 500.0 5.0
Run Code Online (Sandbox Code Playgroud)
如果你只想price从df2
df.join(df2.set_index('id1')[['price']], on='id')
id name count price
0 1 a 10 100.0
1 2 b 20 200.0
2 3 c 30 300.0
3 4 d 40 NaN
4 5 e 50 500.0
Run Code Online (Sandbox Code Playgroud)