Как добавить несогласованно упорядоченные данные файла журнала в pandas фрейм данных? - PullRequest
0 голосов
/ 10 января 2020

Мне нужно обработать список файлов журнала и преобразовать строковые данные в этих файлах в один кадр данных для анализа. Каждый файл журнала содержит одну или несколько пар строк, соответствующих идентификатору, возникновению ошибки и времени ее устранения. Но если было несколько одновременных ошибок на разных идентификаторах, ошибки перечисляются в последовательных строках как группа, а затем соответствующие «очищенные» строки выводятся в виде группы.

Я могу разбивать строки для каждой строки данных и достаточно легко добавлять новые строки в фрейм данных. Но я не знаю, как объединить дату из каждой пары строк в одну строку в df, тем более что они не обязательно упорядочены по одной паре за раз.

Упрощенный файл журнала примера ("example.log" в приведенном ниже коде):

ID1 Error code A
ID1 Error cleared: 00:01:00
ID2 Error code B
ID3 Error code B
ID4 Error code A
ID2 Error cleared: 00:02:00
ID3 Error cleared: 00:02:00
ID4 Error cleared: 00:02:00
ID5 Error code B
ID5 Error cleared: 00:03:00
ID2 Error code A
ID2 Error cleared: 00:04:00
ID6 Error code A
ID6 Error cleared: 00:05:00

Желаемый фрейм данных:

    TID     ERROR   CLEARED
0   ID1     A       00:01:00
1   ID2     B       00:02:00
2   ID3     B       00:02:00
3   ID4     A       00:02:00
4   ID5     B       00:03:00
5   ID2     A       00:04:00
6   ID6     A       00:05:00

Этот код выдает df со всеми данные в правильных столбцах, но со строкой для каждой строки журнала. Я хотел бы иметь только 1 строку для каждой пары данных, очищенных от ошибок / времени.

import pandas as pd

df=pd.DataFrame()
with open('example.log') as file:
    for line in file: 
        part = line.split()
        tid=part[0]
        if 'code' in line:
            error=part[3] 
        if 'cleared' in line: 
            time=part[3]
        dfx=pd.DataFrame([[tid,error,time]],columns=['TID','ERROR','CLEARED'])
        df=df.append(dfx, ignore_index=True)
        tid=''
        error=''
        time=''

В результате получается слишком много ненужных строк:

    TID     ERROR   CLEARED
0   ID1     A   
1   ID1             00:01:00
2   ID2     B   
3   ID3     B   
4   ID4     A   
5   ID2             00:02:00
6   ID3             00:02:00
7   ID4             00:02:00
8   ID5     B   
9   ID5             00:03:00
10  ID2     A   
11  ID2             00:04:00
12  ID6     A   
13  ID6             00:05:00

Если я сделаю отступ для последней несколько строк, поэтому новые строки строятся только после «очищенной» строки, это близко к тому, что я хочу, но ошибки не заполняются правильно.

import pandas as pd

df=pd.DataFrame()
with open('example.log') as file:
    for line in file: 
        part = line.split()
        tid=part[0]
        if 'code' in line:
            error=part[3] 
        if 'cleared' in line: 
            time=part[3]
            dfx=pd.DataFrame([[tid,error,time]],columns=['TID','ERROR','CLEARED'])
            df=df.append(dfx, ignore_index=True)
            tid=''
            error=''
            time=''

Результаты в одной строке на вхождение, но несогласованные данные в Столбец ОШИБКИ:

    TID     ERROR   CLEARED
0   ID1     A       00:01:00
1   ID2     A       00:02:00
2   ID3             00:02:00
3   ID4             00:02:00
4   ID5     B       00:03:00
5   ID2     A       00:04:00
6   ID6     A       00:05:00

Может кто-нибудь помочь мне перенести данные в кадр данных, чтобы ошибки правильно выстроились? Спасибо.

1 Ответ

0 голосов
/ 10 января 2020

Попробуйте с подобным образом:

import pandas as pd
from io import StringIO
import numpy as np

data = """
ID1 Error code A
ID1 Error cleared: 00:01:00
ID2 Error code B
ID3 Error code B
ID4 Error code A
ID2 Error cleared: 00:02:00
ID3 Error cleared: 00:02:00
ID4 Error cleared: 00:02:00
ID5 Error code B
ID5 Error cleared: 00:03:00
ID2 Error code A
ID2 Error cleared: 00:04:00
ID6 Error code A
ID6 Error cleared: 00:05:00
"""
df = pd.read_csv(StringIO(data),sep=' ',header=None,names=["ID", "ER", "CODE", "ERROR"])
df['CLEARED'] = np.where(df['CODE']=='cleared:', df['ERROR'], np.nan)
df=df.bfill()
df=df.loc[df['CODE'] == 'code']
#df=df.drop(['ER','CODE'], inplace=True, axis=1)
print(df.drop(['ER', 'CODE'], axis=1).reset_index(drop=True))

результат:

    ID ERROR   CLEARED
0  ID1     A  00:01:00
1  ID2     B  00:02:00
2  ID3     B  00:02:00
3  ID4     A  00:02:00
4  ID5     B  00:03:00
5  ID2     A  00:04:00
6  ID6     A  00:05:00
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...