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