【问题标题】:Pandas partial match one df with another and return a code based on matchPandas 将一个 df 与另一个部分匹配,并根据匹配返回一个代码
【发布时间】:2021-02-09 22:55:22
【问题描述】:

总的来说,我对 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。

有什么想法吗?感觉自己找了一天也想不出来。

【问题讨论】:

  • 如果您有一个可重复性最低的问题,您将获得更快/更好的答案。尝试制作一个示例数据框,例如df = pd.DataFrame(list(zip([1, 1.5, 3.1, 3.4], [1, -3, 2, 8])), columns=['x', 'y']),然后在 Excel 中根据示例数据框快速制作您想要的示例,并发布其屏幕截图。
  • 在您的示例中,short_message 代码是单字的。您在寻找精确匹配吗?如,如果 'error5' 在 中,那很好,但您是否也在根据 'error5' 短消息寻找匹配 'error 5' 和 'ERROR5' 和 'error_5' ?

标签: python pandas dataframe


【解决方案1】:

我希望这个答案对你有所帮助。我已经创建了一个 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(长消息)通过以长消息为参数调用函数get_short_codes,得到一个新列df1['short_codes']。这个函数基本上创建了一个小写单词列表(所以没有插入!)并检查 ecery 单词是否在 df2 的短代码列表中(带有短代码和代码的数据帧)。如果找到它,则返回该单词(=short_code),否则它将是“未找到”。 在最后一行中,我将df2['codes'] 的内容与df1 合并。现在你有了一个包含长消息的数据框,detilled 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 2016-09-19
    • 2020-05-17
    相关资源
    最近更新 更多