pandas regex новый столбец nan - но тестер regex показывает, что регулярное выражение действительно - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть 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, а применение его к отдельной строке возвращает то, что я хочу?

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Как указал @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...  
0 голосов
/ 13 сентября 2018
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...