【问题标题】:Python: Extract unique sentences from string and place them in new column concatenated with ;Python:从字符串中提取唯一的句子并将它们放在与 ; 连接的新列中
【发布时间】:2021-06-22 16:15:17
【问题描述】:

午后花团锦簇,

当我尝试为某些用户准备数据时,我遇到了一些提取 / 的挑战。 正如我被告知的那样,在 SQL 中很难做到这一点,因为没有明确的模式,我在 python 中尝试了一些东西,但没有成功(因为我还在学习 python)。

问题陈述:

我的 SQL 查询输出是 excel 或文本文件(取决于我如何发布它,但可以两种方式进行)。我有一个字段(excel 或文本文件中的第四列),其中包含一个或多个拒绝原因(参见下面的示例),用逗号分隔。同时,在错误中(有时)使用逗号。

未经任何修改的字段示例

INVOICE_CREATION_FAILED[无效地址信息:公司名称,有限公司:Blueberry Street 10+City++09301+SK|SK000001111|BLD 在第 1 行,发票上的公司 ID 与为系统中的代码注册的公司 ID 不匹配:[AL12345678901]|ABC1D|DL0000001 在第 2 行,采购订单不正确:VTB2R|ADLAVA9 在第 1 行]

期望的输出:

地址信息无效;发票上的公司 ID 与系统中注册代码的公司 ID 不匹配;采购订单不正确

Python 代码:

import pandas

excel_data_df = pandas.read_excel('rejections.xlsx')

# print whole sheet data
print(excel_data_df['Invoice_Issues'].tolist())

excel_data_df['Invoice_Issues'].split(":", 1)

输出

INVOICE_CREATION_FAILED[Invalid Address information:

我试过拆分字符串,但它不能正常工作。它会删除冒号之后的所有内容,这是可以接受的,因为它是这样编码的,但是,我需要修剪不必要的数据字符串并只保留每行所需的输出。 我将非常感谢有关如何修剪输出的任何代码建议,我将只从该字符串中提取所需的内容 - 如果子字符串可用。

在 excel 中,我通常会使用错误列表,以及带有 FIND 和 MATCH 的嵌套 IF 函数。但我不确定如何在 Python 中做到这一点......

非常感谢,

格雷格

【问题讨论】:

  • 嗨,格雷格,是否存在有限的错误列表?您可以列出这些字符串的值,然后为每一行构造一个列表。目前您受到限制,因为您将输出限制为一个 string.split(),即使用 .split(":", 1) 中的第二个参数。
  • 嗨史密斯,这是一个非常特殊的情况,但通常我有一个错误列表,完整列表包含 39 个唯一错误。 E01 =“无效地址信息”,E02 =“错误采购订单”,E03 =“无效增值税号”....... E39 =“没有可用的税行。每张发票可以有一个/所有/很少。我想避免拆分选项,并尝试更多的 IF 错误 E01 在字符串中,只复制“无效地址信息”。
  • 是的,创建一个包含错误的字典以及您希望它们映射到的内容,然后遍历该行并使用字典查看该键是否存在。
  • 能否请您指出我该如何做错误字典?对于“查看该密钥是否存在”部分,您能详细说明一下吗?我对 python 很陌生。
  • 好的,我会写一个答案。

标签: python regex substring python-re strsplit


【解决方案1】:

这不是最快的方法,但在 Python 中,速度很少是最重要的。

在这里,我们手动创建错误字典以及您希望它们映射到的位置,然后我们遍历 Invoice_Issues 中的值,并使用字典查看该键是否存在。

import pandas

# create a standard dataframe with some errors
excel_data_df = pandas.DataFrame({
    'Invoice_Issues': [
        'INVOICE_CREATION_FAILED[Invalid Address information: Company Name, Limited: Blueberry Street 10+City++09301+SK|SK000001111|BLD at line 1 , Company Id on the Invoice does not match with the Company Id registered for the Code in System: [AL12345678901]|ABC1D|DL0000001 at line 2 , Incorrect Purchase order: VTB2R|ADLAVA9 at line 1 ]']
})

# build a dictionary 
# (just like "words" to their "meanings", this maps 
#  "error keys" to their "error descriptions".
errors_dictionary = {
    'E01': 'Invalid Address information',
    'E02': 'Incorrect Purchase order',
    'E03': 'Invalid VAT ID',
    # ....
    'E39': 'No tax line available'
}


def extract_errors(invoice_issue):
    # using the entry in the Invoice_Issues column, 
    # then loop over the dictionary to see if this error is in there.
    # If so, add it to the list_of_errors.
    list_of_errors = []
    for error_number, error_description in errors_dictionary.items():
        if error_description in invoice_issue:
            list_of_errors.append(error_description)
    return ';'.join(list_of_errors)
    

# print whole sheet data
print(excel_data_df['Invoice_Issues'].tolist())


# for every row in the Invoice_Isses column, run the extract_errors function, and store the value in the 'Errors' column.
excel_data_df['Errors'] = excel_data_df['Invoice_Issues'].apply(extract_errors)

# display the dataframe with the extracted errors
print(excel_data_df.to_string())
excel_data_df.to_excel('extracted_errors.xlsx)

【讨论】:

  • 嘿史密斯!只是想告诉您响应是有效的并且功能有效:) thx Greg!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-15
  • 1970-01-01
  • 1970-01-01
  • 2018-01-27
  • 2022-11-03
  • 1970-01-01
相关资源
最近更新 更多