首页 > 解决方案 > 使用 dict 查找 df 的两列值的模式并基于该模式添加新列

问题描述

我有一个df:

MSG_TYPE    MSG_TYPE_1
0   MT740   MT747
1   MT747   MT742
2   MT742   MT799
4   MT740   MT742
5   MT742   MT742

我有一个 dict 作为 d:

[{'MSG_TYPE': 'MT740', 'MSG_TYPE_1': 'MT747', 'RELATIONSHIP': 'AMENDMENT_TO_AUTHORISISATION'}, {'MSG_TYPE': 'MT740', 'MSG_TYPE_1': 'MT742', 'RELATIONSHIP': 'REIMBURSEMENT_CLAIM_FOR'}, {'MSG_TYPE': 'MT740', 'MSG_TYPE_1': 'MT799', 'RELATIONSHIP': 'ADDITIONAL_INFORMATION'}, {'MSG_TYPE': 'MT742', 'MSG_TYPE_1': 'MT799', 'RELATIONSHIP': 'ADDITIONAL_INFORMATION'}, {'MSG_TYPE': 'MT742', 'MSG_TYPE_1': 'MT742', 'RELATIONSHIP': 'REIMBURSEMENT_CLAIM_FOR'}, {'MSG_TYPE': 'MT742', 'MSG_TYPE_1': 'MT740', 'RELATIONSHIP': 'REIMBURSEMENT_CLAIM_FOR'}, {'MSG_TYPE': 'MT742', 'MSG_TYPE_1': 'MT747', 'RELATIONSHIP': 'AMENDMENT_TO_AUTHORISISATION'}

我想将 df 的所有 rown 的模式与 dict d 匹配,如果特定行的模式与键值对条目之一相同,并附加一个新列 df['RELATIONSHIP'] 相同字典中匹配的条目,如果不匹配,则为 NAN。

我已经相应地编写了我的代码:

for item in df.iterrows():
    for value in d:
        if item[1]==value['MSG_TYPE'] & item[2]==value['MSG_TYPE_1']:
            df['RELATIONSHIP']=value['RELATIONSHIP']

这给了我一个错误:

IndexError: tuple index out of range

有没有更好的 Pythonic 方式来执行此操作,因为 dict 键名与 df 列名相同。

标签: pythonpandasdataframedictionary

解决方案


尝试merge

df.merge(pd.DataFrame(d), on=['MSG_TYPE','MSG_TYPE_1'], how='left')

输出:

  MSG_TYPE MSG_TYPE_1                  RELATIONSHIP
0    MT740      MT747  AMENDMENT_TO_AUTHORISISATION
1    MT747      MT742                           NaN
2    MT742      MT799        ADDITIONAL_INFORMATION
3    MT740      MT742       REIMBURSEMENT_CLAIM_FOR
4    MT742      MT742       REIMBURSEMENT_CLAIM_FOR

推荐阅读