[英]Pandas: Best way to join two dataframes based on a common column
我知道這是一個基本問題。 但是,請聽我說完。
我有以下數據框:
In [722]: m1
Out[722]:
Person_id Evidence_14 Feature_14
0 100 90.0 True
1 101 NaN NaN
2 102 91.0 True
3 103 NaN NaN
4 104 94.0 True
5 105 NaN NaN
6 106 NaN NaN
In [721]: m3
Out[721]:
Person_id Evidence_14 Feature_14
0 100 NaN NaN
1 101 99.0 False
2 102 NaN NaN
3 103 95.0 False
4 104 NaN NaN
5 105 NaN NaN
6 106 93.0 False
預期 Output:
In [734]: z
Out[734]:
Person_id Evidence_14 Feature_14
0 100 90.0 True
1 101 99.0 False
2 102 91.0 True
3 103 95.0 False
4 104 94.0 True
5 105 NaN NaN
6 106 93.0 False
我能夠像下面這樣解決這個問題:
In [725]: z = m1.merge(m3, on='Person_id')
In [728]: z['Evidence_14'] = z.Evidence_14_x.combine_first(z.Evidence_14_y)
In [731]: z['Feature_14'] = z.Feature_14_x.combine_first(z.Feature_14_y)
In [733]: z.drop(['Evidence_14_x', 'Evidence_14_y', 'Feature_14_x', 'Feature_14_y'], 1, inplace=True)
In [734]: z
Out[734]:
Person_id Evidence_14 Feature_14
0 100 90.0 True
1 101 99.0 False
2 102 91.0 True
3 103 95.0 False
4 104 94.0 True
5 105 NaN NaN
6 106 93.0 False
但是,有沒有更清潔/更好的方法來做到這一點? 我錯過了一些非常明顯的東西嗎?
如果列名稱匹配並且需要通過Person_id
值匹配,請使用:
m = m1.set_index('Person_id').combine_first(m2.set_index('Person_id')).reset_index()
如果兩個 DataFrames 解決方案中的索引值相同並且Person_id
相同,則應通過與原始索引值匹配來簡化:
m = m1.combine_first(m2)
由於 Person_id 唯一定義了 m1 和 m3 中的相關行,因此您必須使用 set_index。 看這個:
import pandas as pd
df1 = pd.DataFrame({'id':[11, 22, 33,44],'A': [None, 0, 17, None], 'B': [None, 4, 19,None]})
df2 = pd.DataFrame({'id':[111, 222], 'A': [9999, 9999], 'B': [7777, 7777]})
# df1 = df1.set_index('id')
# df2 = df2.set_index('id')
df1.combine_first(df2)
Out[32]:
id A B
0 11 9999.0 7777.0
1 22 0.0 4.0
2 33 17.0 19.0
3 44 NaN NaN
如果您不使用 set_index ,則 A 的第一個值將被更改,即使它的 id 為 df1 中的 11 和 df2 中的 111 (不同的 id)
另請注意,如果您使用 set_index,m1 中不存在的 id 將被添加到結果中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.