总的来说,我对 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。
有什么想法吗?感觉找了一整天,什么都查不出来。
答案 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