【问题标题】:pandas regex new column nan - but regex tester shows regex is validpandas 正则表达式新列 nan - 但正则表达式测试器显示正则表达式有效
【发布时间】:2018-09-12 19:52:53
【问题描述】:

我有一个来自测试回归失败的错误消息的 csv,我正在将其导入 pandas 数据帧,但我想找到一些与异常有关的子字符串,特别是。

我用 .csv 的内容填充我的数据框,如下所示:

df = pd.read_csv('ErrorMessage3.csv', header=None, sep=',', 
             names=['ErrorMessage'])

我有以下正则表达式和相应的测试字符串(这是我的数据框错误消息列中的第一个条目),它返回的正是我想要的:

teststring = "Step 13 - Iteration 1 Failed: Action: <Update Latest CC Exp 
Date Record from Epay Account {DBServer;UserName;Password='', 
DatabaseName='',Year Offset='-10'}> ---> 
System.Data.SqlTypes.SqlNullValueException: Data is Null. This method or 
property cannotbecalled 
on Null values. ---> System.Data.SqlTypes.SqlNullValueException2: Data is Null."

re.findall(r"---> ([^:]+): ", teststring)

导致以下输出:

['System.Data.SqlTypes.SqlNullValueException',
 'System.Data.SqlTypes.SqlNullValueException2']

但我希望能够将其添加为我的数据框中的“例外”列。我认为这会起作用:

df['Exceptions'] = df['ErrorMessage'].str.extract(r"---> ([^:]+): ")

但是当我运行它时,我添加了我的“异常”列,但所有行都是 NaN。我验证了我的 ErrorMessage 是对象类型,并且我使用了在线正则表达式测试器来验证我的 ErrorMessage 条目的至少一个子集确实包含与我的正则表达式匹配的异常。我已经阅读了其他一些看起来非常相似的堆栈溢出问题,但我运气不佳。

为什么将正则表达式应用于数据框会产生 nan,但将其应用于单个字符串会返回我想要的结果?

【问题讨论】:

  • 试试df['Exceptions'] = df['ErrorMessage'].str.extractall(r"---&gt; ([^:]+)").apply(", ".join)
  • @WiktorStribiżew 相同的结果,我的 Exceptions 列仅包含 NaN
  • @Sphinx 是的,如果我获取测试字符串并手动将其分配为我的数据框中的一个元素,它确实有效。问题是,当通过读取 .csv 填充数据框时,它不起作用。我将首先进行编辑以显示我是如何读取数据的,也许这会有所帮助。
  • @sphinx 不确定我是否遵循,我针对数据框的错误消息列中存在的几个条目测试了我的正则表达式,并且我用来演示的测试字符串是从该列中的第一个条目复制的.这是这里的关键问题:我知道正则表达式在应用于该字符串时会返回一些内容,但在直接应用于数据框时它不起作用。
  • str.extract 只会在字符串pandas.pydata.org/pandas-docs/stable/generated/…中找到第一个匹配项

标签: python regex pandas dataframe


【解决方案1】:
teststring1 = """Step 13 - Iteration 1 Failed: Action: <Update Latest CC Exp Date Record from Epay Account 
                {DBServer;UserName;Password='', DatabaseName='',Year Offset='-10'}> ---> System.Data.SqlTypes.SqlNullValueException1: 
                Data is Null. This method or property cannotbecalled on Null values. ---> System.Data.SqlTypes.SqlNullValueException2: Data is Null. 
                ---> System.Data.SqlTypes.SqlNullValueException21:  ---> System.Data.SqlTypes.SqlNullValueException22:  ---> System.Data.SqlTypes.SqlNullValueException23: 
                ---> System.Data.SqlTypes.SqlNullValueException24: """
teststring2 = """Step 13 - Iteration 1 Failed: Action: <Update Latest CC Exp Date Record from Epay Account 
                {DBServer;UserName;Password='', DatabaseName='',Year Offset='-10'}> ---> System.Data.SqlTypes.SqlNullValueException3: 
                Data is Null. This method or property cannotbecalled on Null values. ---> System.Data.SqlTypes.SqlNullValueException4: Data is Null."""
teststring3 = """Step 13 - Iteration 1 Failed: Action: <Update Latest CC Exp Date Record from Epay Account 
                {DBServer;UserName;Password='', DatabaseName='',Year Offset='-10'}> ---> System.Data.SqlTypes.SqlNullValueException5: 
                Data is Null. This method or property cannotbecalled on Null values. ---> System.Data.SqlTypes.SqlNullValueException6: Data is Null."""
teststring4 = """Step 13 - Iteration 1 Failed: Action: <Update Latest CC Exp Date Record from Epay Account 
                {DBServer;UserName;Password='', DatabaseName='',Year Offset='-10'}> ---> System.Data.SqlTypes.SqlNullValueException7: 
                Data is Null. This method or property cannotbecalled on Null values. ---> System.Data.SqlTypes.SqlNullValueException8: Data is Null."""
teststring5 = """Step 13 - Iteration 1 Failed: Action: <Update Latest CC Exp Date Record from Epay Account 
                {DBServer;UserName;Password='', DatabaseName='',Year Offset='-10'}> ---> System.Data.SqlTypes.SqlNullValueException9: 
                Data is Null. This method or property cannotbecalled on Null values. ---> System.Data.SqlTypes.SqlNullValueException10: Data is Null."""
teststring6 = """Step 13 - Iteration 1 Failed: Action: <Update Latest CC Exp Date Record from Epay Account 
                {DBServer;UserName;Password='', DatabaseName='',Year Offset='-10'}> ---> System.Data.SqlTypes.SqlNullValueException11: 
                Data is Null. This method or property cannotbecalled on Null values. ---> System.Data.SqlTypes.SqlNullValueException12: Data is Null."""


values = [[teststring1], [teststring2], [teststring3], [teststring4], [teststring5], [teststring6]]
header = ['ErrorMessage']

df = pd.DataFrame(values, columns=header)

exceptions = df['ErrorMessage'].str.extractall(r"---> ([^:]+): ")
  • extractall 返回一个新的 MultiIndex DataFrame,其中第一个索引将匹配原始 DataFrame 索引,第二个索引将是提取或匹配的数量。新旧 DataFrame 不兼容。
                                                  0
   match    
0   0   System.Data.SqlTypes.SqlNullValueException1
    1   System.Data.SqlTypes.SqlNullValueException2
    2   System.Data.SqlTypes.SqlNullValueException21
    3   System.Data.SqlTypes.SqlNullValueException22
    4   System.Data.SqlTypes.SqlNullValueException23
    5   System.Data.SqlTypes.SqlNullValueException24
1   0   System.Data.SqlTypes.SqlNullValueException3
    1   System.Data.SqlTypes.SqlNullValueException4
2   0   System.Data.SqlTypes.SqlNullValueException5
    1   System.Data.SqlTypes.SqlNullValueException6
3   0   System.Data.SqlTypes.SqlNullValueException7
    1   System.Data.SqlTypes.SqlNullValueException8
4   0   System.Data.SqlTypes.SqlNullValueException9
    1   System.Data.SqlTypes.SqlNullValueException10
5   0   System.Data.SqlTypes.SqlNullValueException11
    1   System.Data.SqlTypes.SqlNullValueException12

【讨论】:

    【解决方案2】:

    正如@Trenton_M 指出的那样,extractall 返回一个新的MultiIndex DataFrame,因此一种解决方案是使用groupby,然后加入所有匹配的字符串。

    下面是一个简单的演示

    import pandas as pd
    import numpy as np
    df = pd.DataFrame([""""Step 13 - Iteration 1 Failed: Action: <Update Latest CC Exp 
    Date Record from Epay Account {DBServer;UserName;Password='', 
    DatabaseName='',Year Offset='-10'}> ---> 1System.Data.SqlTypes.SqlNullValueException: Data is Null. This method or 
    property cannotbecalled 
    on Null values. ---> 2System.Data.SqlTypes.SqlNullValueException2: Data is Null."""] * 2, columns=['ErrorMessage'])
    
    mulIndexDataFrame = df['ErrorMessage'].str.extractall(r"---> ([^:]+): ")
    df['test'] = mulIndexDataFrame.groupby(mulIndexDataFrame.index.get_level_values(0))[0].apply(lambda x: ','.join(x))
    print(df)
    

    输出:

                                            ErrorMessage  \
    0  "Step 13 - Iteration 1 Failed: Action: <Update...   
    1  "Step 13 - Iteration 1 Failed: Action: <Update...   
    
                                                    test  
    0  1System.Data.SqlTypes.SqlNullValueException,2S...  
    1  1System.Data.SqlTypes.SqlNullValueException,2S...  
    

    【讨论】:

    • @sphinxI 运行了以下命令: mulIndexDataFrame = df['ErrorMessage'].str.extractall(r"---> ([^:]+): ") 它创建了一个新的数据帧 (正如预期的那样)大小为(0,1)并且它是空的。这不是预期的,我想。我认为我通过读取 .csv 创建的原始数据框一定有问题,但我不知道如何解决。
    • @Ican 如果是这样,试试mulIndexDataFrame = df['ErrorMessage'].str.extractall(r"([^\n])"),输出是什么?输出是什么?
    猜你喜欢
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多