Pandas 将一个 df 与另一个部分匹配,并根据匹配返回一个代码

时间:2021-02-09 22:55:22

标签: python pandas dataframe

总的来说,我对 Python 和 Pandas 还是比较陌生。

我有两个 .CSV,我已将它们加载到 Pandas 中的单独数据帧中。 df1 包含 9 列,但我只关心最后一列,“错误消息文本”,它是一个包含错误详细信息的文本字符串。在 df2 上,我有一列名为“短错误消息文本”和“错误代码”

df2 上的错误消息是 df1 中可能存在的内容的清理版本,我正在尝试在 df1 上进行部分文本匹配,id 给出的错误代码与 df2 上的短错误匹配,然后在新列,给我引用的对应代码。我无法在这里进行合并或加入,因为数据不完全匹配。也许是一些软的模糊匹配?我可以使用与数组的索引匹配在 excel 中完成此操作。

以下是我正在查看的示例:

df1: ...,第9列 “这是 error5 错误” “这东西因为用户错误而坏了” “后台有问题”

df2: 短消息,代码 “错误5”,1 “用户错误”,2 "后端",3

想要的结果: df1: 第9列 “这是 error5 错误”,1 “这东西因为用户错误而坏了”,2 "后端",3

如果匹配,返回代码。如果不是,则返回一个默认值,如代码 0。

有什么想法吗?感觉找了一整天,什么都查不出来。

1 个答案:

答案 0 :(得分:0)

希望这个回答对你有帮助。我创建了一个 MRE(请下次在您的问题中包含一个):

import numpy as np
import pandas as pd
import re

def get_short_code(long_message, df2: pd.DataFrame):
    words = re.findall(r'\w+', long_message)
    for word in [w.lower() for w in words]:
        if word in df2['short_codes'].values:
            return word
    return "notfound"

dic1 = {
    "long_messages": ["this is long message error5", "this is long message error6", "this is long message backend",
    "this is long message something_else","this is long message" ]
}

dic2  = {
    "short_codes": ["error5", "error6", "tbackend", "something_else"],
    "codes" : ["ID_1", "ID_2", "ID_3", "ID_4"]
}

df1 = pd.DataFrame(data=dic1)
df2 = pd.DataFrame(data=dic2)

df1["short_codes"] = df1.apply(lambda row: get_short_code(row['long_messages'], df2), axis=1)
df1 = pd.merge(df1,df2[['short_codes','codes']],on='short_codes', how='left')

这里发生的事情如下: df1(长消息)通过使用长消息作为参数调用函数 df1['short_codes'] 来获取新列 get_short_codes。这个函数基本上创建了一个小写单词列表(所以没有插入!)并检查 ecery 单词是否在 df2 的 short_codes 列表中(带有 short_codes 和代码的数据帧)。如果找到它,则返回该词(=short_code),否则将“未找到”。 在最后一行,我将 df2['codes'] 的内容与 df1 合并。现在你有一个包含长消息的数据框,提取的 short_codes 和来自 df2 的相应代码:

                         long_messages     short_codes codes
0          this is long message error5          error5  ID_1
1          this is long message error6          error6  ID_2
2         this is long message backend        notfound   NaN
3  this is long message something_else  something_else  ID_4
4                 this is long message        notfound   NaN
相关问题