繁体   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