如何将不一致排序的日志文件数据附加到pandas数据框?

问题描述 投票:0回答:1

我需要处理一系列日志文件,并将这些文件中的字符串数据转换为一个数据帧以进行分析。每个日志文件包含一对或多对与ID,错误发生和错误清除时间相对应的行。但是,如果在不同的ID上同时存在多个错误,则会在连续的行中将这些错误作为一组列出,然后将相应的“已清除”行作为一组列出。

我可以为数据的每一行拆分字符串,并且可以轻松地将新行追加到数据框。但是我不知道如何将每对行中的日期组合到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

有人可以帮助我将数据提取到数据框中,以便正确地排列错误吗?谢谢。

python pandas append
1个回答
0
投票

尝试使用类似的方法:

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
© www.soinside.com 2019 - 2024. All rights reserved.