[英]Compare a column in one dataframe with many columns in another dataframe pandas
我有兩個數據框:
df1:
ID name1
0 '' 'company-1'
1 '' 'company2'
2 '' 'company 3'
df2:
ID name2 name3 name4
0 '1' 'company1' 'company.1' 'company-1'
1 '2' 'company2' 'company.2' 'company-2'
我想將 df1['name1'] 與 df2 中的名稱列進行比較,並將 df2 中的 ID 放在 df1 中的 ID 列中。
我這樣做了:
for i in range(len(df1)):
for j in range(len(df2)):
if df1.iloc[i]['name1'] == df2.iloc[j]['name2']:
df1.iloc[i]['ID'] = df2.iloc[j]['ID']
break
elif df1.iloc[i]['name1'] == df2.iloc[j]['name3']:
df1.iloc[i]['ID'] = df2.iloc[j]['ID']
break
elif df1.iloc[i]['name1'] == df2.iloc[j]['name4']:
df1.iloc[i]['ID'] = df2.iloc[j]['ID']
break
else:
df1[i]['ID'] = ''
預期結果將是:
ID name1
0 '1' 'company-1'
1 '2' 'company2'
2 '' 'company 3'
它可以工作,但效率極低,需要長達數小時。 你能幫我么?
如果問題不符合要求的標准,我很抱歉。 這是我第一次在這里發帖。 我也喜歡一些關於這方面的建議。
這可以通過多種方式解決。 您可以使用逐行apply
,將第二幀轉換為映射/查找表(Python dict
),或嘗試連接兩個幀。 這是后者的一個例子:
import pandas as pd
# The given input data
data_1 = {"ID": ["", "", ""], "name1": ["company-1", "company2", "company 3"]}
data_2 = {"ID" : ["1", "2"], "name2": ["company1", "company2"], "name3": ["company.1", "company.2"],
"name4": ["company-1", "company-2"]}
df_1 = pd.DataFrame(data_1)
df_2 = pd.DataFrame(data_2)
# Changing the second frame into "long format" and only keeping the "ID" and "potential_matches" variables
unpivoted: pd.DataFrame = df_2.melt("ID", value_name="potential_matches")[["ID", "potential_matches"]]
# Merging and tidyiing up
expected = (df_1
.merge(unpivoted, how="left", left_on=["name1"], right_on=["potential_matches"])
.drop(columns=["ID_x", "potential_matches"])
.rename(columns={"ID_y": "ID"})[["ID", "name1"]])
print(expected)
如果性能仍然存在問題,您可以嘗試在name2, name3, name4
的多索引上匹配name1
。
ID | 名稱1 |
---|---|
1 | 公司-1 |
2 | 公司2 |
楠 | 公司 3 |
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.