2017-10-18 5 views
1

J'écris un script qui analyse les paramètres de requête d'un fichier journal apache dans une table pandas.Comment joindre plusieurs lignes (multi-index?) Dans pandas dans une rangée OU Comment extraire les paramètres d'une demande d'un journal Apache (chaîne)?

Une demande d'exemple est comme ceci:

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 

Il y a beaucoup de paramètres et pas d'ordre fixe. Donc, je pense que la méthode pandas extract() ne fonctionnera pas. C'est pourquoi j'essaye de le faire avec extractall(). Ma première version d'une expression regex et l'extraction avec elle est comme ceci:

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) 

Alors que je reçois ce dataframe retour:

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 

Mais à la fin je voudrais avoir quelque chose comme ceci:

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

donc ma question à la fin: Comment puis-je faire partie de ces simples lignes à une ligne?

+0

'(P GET (= \ s)?) | \/v1 \/(? P [^? \ s] *) | de = (? P [^ & \ s] *) | to = (? P [^ & \ s] *) '? – ctwheels

Répondre

0

Vous pouvez utiliser

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

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

Sortie:

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

Pour obtenir l'index vous pouvez utiliser ndf.index = ndf.index.str[-2]

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