2017-04-12 8 views
1

Wie liest man die Datei als Datenframe in Pandas Python?Wörterbuch in Datenrahmen Python konvertieren

Die Datei enthält die folgenden

{"headers": {"ai5": "8fa683e59c02c04cb781ac689686db07", "debug": null, "random": null, "sdkv": "7.6"}, "post": {"event": "ggstart", "ts": "1462759195259"}, "params": {}, "bottle": {"timestamp": "2016-05-09 02:00:00.004906", "game_id": "55107008"}} 
{"headers": {"ai5": "335644267c1d5f04eaea7bc6f51b1861", "debug": null, "random": null, "sdkv": "7.6"}, "post": {"event": "ggstart", "ts": "1462759189745"}, "params": {}, "bottle": {"timestamp": "2016-05-09 02:00:00.033775", "game_id": "55107008"}} 

.... viele Zeilen unterhalb

Wie ich es in einen Datenrahmen, Dictionary-Schlüssel als Header laden kann?

+0

Ist dies, wie die Datei sieht aus? Also ist es eine Datei, in der die Zeilen JSON-Einträge sind? –

+0

@ WillemVanOnsem, ja so sieht die Datei aus, es ist .log-Datei. –

Antwort

0

Sie Pythons open + readlines zu erstellen, um das pd.Series Objekt, dann eine Kombination aus json.loads und json_normalize

verwenden verwenden könnten
import json 
import pandas as pd 

pd.io.json.json_normalize(
    pd.Series(open('file.json').readlines()).apply(json.loads)) 

enter image description here

2

können Sie verwenden read_json mit dem Parameter lines=True zuerst:

df = pd.read_json('file.json', lines=True) 
print (df) 
               bottle \ 
0 {'timestamp': '2016-05-09 02:00:00.004906', 'g... 
1 {'timestamp': '2016-05-09 02:00:00.033775', 'g... 

              headers params \ 
0 {'ai5': '8fa683e59c02c04cb781ac689686db07', 'r...  {} 
1 {'ai5': '335644267c1d5f04eaea7bc6f51b1861', 'r...  {} 

              post 
0 {'event': 'ggstart', 'ts': '1462759195259'} 
1 {'event': 'ggstart', 'ts': '1462759189745'} 

Und dann concat verschachtelte dictionaries, Ausgang ist MultiIndex in Spalten:

df = pd.concat([pd.DataFrame(df[x].values.tolist()) for x in df], axis=1, keys=df.columns) 
print (df) 
    bottle              headers \ 
    game_id     timestamp        ai5 
0 55107008 2016-05-09 02:00:00.004906 8fa683e59c02c04cb781ac689686db07 
1 55107008 2016-05-09 02:00:00.033775 335644267c1d5f04eaea7bc6f51b1861 

         post     
    debug random sdkv event    ts 
0 None None 7.6 ggstart 1462759195259 
1 None None 7.6 ggstart 1462759189745 

Slowier Lösung mit apply(pd.Series)

df = pd.concat([df[x].apply(pd.Series) for x in df], axis=1, keys=df.columns) 
print (df) 
    bottle              headers \ 
    game_id     timestamp        ai5 
0 55107008 2016-05-09 02:00:00.004906 8fa683e59c02c04cb781ac689686db07 
1 55107008 2016-05-09 02:00:00.033775 335644267c1d5f04eaea7bc6f51b1861 

         post     
    debug random sdkv event    ts 
0 None None 7.6 ggstart 1462759195259 
1 None None 7.6 ggstart 1462759189745 

Zum Entfernen MultiIndexmap hinzufügen:

df = pd.concat([pd.DataFrame(df[x].values.tolist()) for x in df], axis=1, keys=df.columns) 
df.columns = df.columns.map('_'.join) 
print (df) 
    bottle_game_id   bottle_timestamp \ 
0  55107008 2016-05-09 02:00:00.004906 
1  55107008 2016-05-09 02:00:00.033775 

         headers_ai5 headers_debug headers_random headers_sdkv \ 
0 8fa683e59c02c04cb781ac689686db07   None   None   7.6 
1 335644267c1d5f04eaea7bc6f51b1861   None   None   7.6 

    post_event  post_ts 
0 ggstart 1462759195259 
1 ggstart 1462759189745 
+0

Danke @jazrael. Deine Antwort funktioniert. Dies war meine erste Frage bei StackOverflow und bekam die Antwort in 30 Minuten. Es ist großartig. –

Verwandte Themen