Python 如何将顺序不一致的日志文件数据附加到数据帧?

Python 如何将顺序不一致的日志文件数据附加到数据帧?,python,pandas,append,Python,Pandas,Append,我需要处理日志文件列表,并将这些文件中的字符串数据转换为一个数据帧进行分析。每个日志文件包含一对或多对与ID、错误发生和错误清除时间相对应的行。但是,如果不同ID上同时存在多个错误,则将这些错误作为一个组列在连续行上,然后将相应的“已清除”行列为一个组 我可以为每一行数据拆分字符串,并且可以很容易地将新行附加到数据帧中。但我不知道如何将每对行中的日期组合成df中的一行,特别是因为它们不一定一次订购一对 简化的示例日志文件(“下面代码中的example.log”): 所需数据帧: TID

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

我可以为每一行数据拆分字符串,并且可以很容易地将新行附加到数据帧中。但我不知道如何将每对行中的日期组合成df中的一行,特别是因为它们不一定一次订购一对

简化的示例日志文件(“下面代码中的example.log”):

所需数据帧:

    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,所有数据都在正确的列中,但日志的每一行都有一行。我希望每对错误/时间清除数据只有一行

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
有人能帮我把数据拉到数据框中,这样错误就可以正确排列了吗?
谢谢。

试试类似的方法:

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

您没有任何丢失的数据吗?另一方面,您假定TID是唯一的?没有丢失的数据(参见示例日志)。如果再次发生错误,TID可能会重复。我已经在示例中这样做了:ID2出现时带有错误代码B(在00:02:00清除),ID2稍后出现时带有错误代码A(在00:04:00清除)。谢谢你,GiovaniSalazar我已将df.bfill()添加到我的技巧包中。
    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