如何将pandas中的多行(multiindex?)连接到一行,或者如何从apache日志(string)的请求中提取参数?

2024-09-24 10:26:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个脚本,将apache日志文件的请求参数解析到pandas表中

请求示例如下:

GET /v1/board?id=8504178&limit=1&to=8504177 HTTP/1.1
GET /v1/connections?from=850417&to=8504177 HTTP/1.1
GET /v1/location?query=850417

参数多,顺序不固定。所以我认为pandas方法extract()将不起作用。 这就是我尝试使用extractall()的原因。我的正则表达式的第一个版本及其提取如下:

req_patt = ("(?P<request>GET) \/v1\/(?P<resource>connections|stationboard|locations)|"
        "from=(?P<from>.*?)&|"
        "to=(?P<to>\d*|\w*)(?P<to_del>&|\s)"
)


df_temp = df['fullrequest'].str.extractall( req_patt )

所以我得到了这个数据帧:

actual output:
index  requests resources    from     to 
(0, 0) GET      connections  nan      nan
(0, 1) nan      nan          8504178  nan
(0, 2) nan      nan          nan      8504177
(1, 0) GET      stationboard nan      nan
(1, 1) nan      nan          nan      8504177

但最后我还是想要这样的东西:

expected output: 
index  requests resources    from     to 
0      GET      connections  8504178  8504177
1      GET      stationboard nan      8504177

最后我的问题是: 如何将这些单行连接到一行


Tags: tofromhttppandasdfoutput参数get
1条回答
网友
1楼 · 发布于 2024-09-24 10:26:07

你可以用

ndf = df.apply(sorted,key=pd.isnull).set_index('index')

ndf = ndf[~ndf.isnull().all(1)]

输出:

     requests     resources       from         to
index                                             
(0,0)      GET   connections  8504178.0  8504177.0
(0,1)      GET  stationboard        NaN  8504177.0

要获取索引,可以使用ndf.index = ndf.index.str[-2]

     requests     resources       from         to
index                                             
0          GET   connections  8504178.0  8504177.0
1          GET  stationboard        NaN  8504177.0

相关问题 更多 >