簡體   English   中英

將一個 dataframe 中的一列與另一個 dataframe pandas 中的許多列進行比較

[英]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

Output

ID 名稱1
1 公司-1
2 公司2
公司 3

暫無
暫無

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

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