GOOGLE ADS

Donnerstag, 14. April 2022

Pandas DataFrame: Normalisieren Sie eine JSON-Spalte und führen Sie sie mit anderen Spalten zusammen

Ich habe einen Pandas DataFrame, der eine Spalte mit mehreren JSON-Datenelementen als Liste von Diktaten enthält. Ich möchte die JSON-Spalte normalisieren und die Nicht-JSON-Spalten duplizieren:

# creating dataframe
df_actions = pd.DataFrame(columns=['id', 'actions'])
rows = [[12,json.loads('[{"type": "a","value": "17"},{"type": "b","value": "19"}]')],
[15, json.loads('[{"type": "a","value": "1"},{"type": "b","value": "3"},{"type": "c","value": "5"}]')]]
df_actions.loc[0] = rows[0]
df_actions.loc[1] = rows[1]
>>>df_actions
id actions
0 12 [{'type': 'a', 'value': '17'}, {'type': 'b', '...
1 15 [{'type': 'a', 'value': '1'}, {'type': 'b', 'v...

Ich will

>>>df_actions_parsed
id type value
12 a 17
12 b 19
15 a 1
15 b 3
15 c 5

Ich kann JSON-Daten normalisieren mit:

pd.concat([pd.DataFrame(json_normalize(x)) for x in df_actions['actions']],ignore_index=True)

aber ich weiß nicht, wie ich das wieder mit der ID-Spalte des ursprünglichen DataFrame verbinden soll.


Lösung des Problems

Sie können concatmit dict comprehensionwith popfür die Spalte extrahieren, die zweite Ebene entfernen und joinzum Original:

df1 = (pd.concat({i: pd.DataFrame(x) for i, x in df_actions.pop('actions').items()})
.reset_index(level=1, drop=True)
.join(df_actions)
.reset_index(drop=True))

Was ist gleich:

df1 = (pd.concat({i: json_normalize(x) for i, x in df_actions.pop('actions').items()})
.reset_index(level=1, drop=True)
.join(df_actions)
.reset_index(drop=True))

print (df1)
type value id
0 a 17 12
1 b 19 12
2 a 1 15
3 b 3 15
4 c 5 15

Keine Kommentare:

Kommentar veröffentlichen

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...