我有兩個資料框,我需要根據一個條件在兩列上進行比較。
df1 看起來像這樣;
| 姓名 | 值_1 | 價值_2 |
|---|---|---|
| 一種 | 貓 | 拍 |
| 乙 | 墊 | 墊 |
| C | 拍 | 坐 |
df2 看起來像這樣;
| 姓名 | 值_1 | 價值_2 |
|---|---|---|
| D | 拍 | 貓 |
| 乙 | 蝙蝠 | 墊 |
| F | 總 | 拍 |
我想匹配兩個資料幀中的 Value_1 和 Value_2,并在 value_1 或 value_2 匹配時從兩個資料幀回傳名稱。
結果應如下所示 - 如果 value_1 或 value_2 匹配,則它應具有 df1 和 df2 的名稱。
| 名稱_x | 價值 | 名稱_y |
|---|---|---|
| 一種 | 拍 | D |
| 乙 | 蝙蝠 | 乙 |
| C | 總 | F |
我已經嘗試使用“on”條件和“left_on”和“right_on”的 pd.merge。它適用于匹配一列。我不能指定任何一個/或條件。pd.merge 僅在 value_1 和 value_2 都匹配時回傳結果。當 df1 中的 value_1 或 value_2 與 df2 中的 value_1 或 value_2 匹配時,如何獲取名稱?
uj5u.com熱心網友回復:
您可以使用pd.wide_to_long將 DataFrame 從寬格式轉為長格式,然后合并資料框
df1 = (pd.wide_to_long(df1, stubnames='Value', i='Name', sep='_', j='i')
.reset_index(level='Name'))
df2 = (pd.wide_to_long(df2, stubnames='Value', i='Name', sep='_', j='i')
.reset_index(level='Name'))
out = pd.merge(df1, df2, on=['Value']).drop_duplicates()
print(out)
Name_x Value Name_y
0 A cat D
1 B mat E
3 C pat D
4 C pat F
5 A pat D
6 A pat F
uj5u.com熱心網友回復:
如果您不在乎它是在 Value_1 還是 Value_2 中,請使用melt將每個資料幀展平為單個列,并在該新列上合并
>>> df1
Name Value_1 Value_2
0 A cat pat
1 B mat mat
2 C pat sat
>>> df2
Name Value_1 Value_2
0 D pat cat
1 E bat mat
2 F tot pat
>>> df1.melt('Name')
Name variable value
0 A Value_1 cat
1 B Value_1 mat
2 C Value_1 pat
3 A Value_2 pat
4 B Value_2 mat
5 C Value_2 sat
>>> df1.melt('Name').merge(df2.melt('Name'), on='value')
Name_x variable_x value Name_y variable_y
0 A Value_1 cat D Value_2
1 B Value_1 mat E Value_2
2 B Value_2 mat E Value_2
3 C Value_1 pat D Value_1
4 C Value_1 pat F Value_2
5 A Value_2 pat D Value_1
6 A Value_2 pat F Value_2
>>>
uj5u.com熱心網友回復:
從你的 OP 我認為如果你得到重復你會很高興。例如,B value_1 和 value_2 都匹配 E value_2 以創建兩行。如果是這樣,融化和合并將使您到達那里:
newdf = df1.melt(id_vars = 'Name').merge(df2.melt(id_vars='Name'), how='inner', on='value')
輸出:
Name_x variable_x value Name_y variable_y
0 A Value_1 cat D Value_2
1 B Value_1 mat E Value_2
2 B Value_2 mat E Value_2
3 C Value_1 pat D Value_1
4 C Value_1 pat F Value_2
5 A Value_2 pat D Value_1
6 A Value_2 pat F Value_2
然后,如果您只想獲取 OP 中顯示的列,您可以提取所需的列:
newdf = newdf[['Name_x', 'value', 'Name_y']]
輸出:
Name_x value Name_y
0 A cat D
1 B mat E
2 B mat E
3 C pat D
4 C pat F
5 A pat D
6 A pat F
然后要擺脫索引,您可以根據需要將 Name_x 設定為索引。希望這可以幫助。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/480589.html
