Erweitern Sie das verschachtelte JSON-Array innerhalb der Spalte im Pandas-DatenrahmenPython

Python-Programme
Guest
 Erweitern Sie das verschachtelte JSON-Array innerhalb der Spalte im Pandas-Datenrahmen

Post by Guest »

Ich habe JSON-Daten (die von Mongodb stammen), die Tausende von Datensätzen enthalten (also ein Array/eine Liste von JSON-Objekten) mit einer Struktur wie der folgenden für jedes Objekt:

{
"id":1,
"first_name":"Mead",
"last_name":"Lantaph",
"email":"mlantaph0@opensource.org",
"gender":"Male",
"ip_address":"231.126.209.31",
"nested_array_to_expand":[
{
"property":"Quaxo",
"json_obj":{
"prop1":"Chevrolet",
"prop2":"Mercy Streets"
}
},
{
"property":"Blogpad",
"json_obj":{
"prop1":"Hyundai",
"prop2":"Flashback"
}
},
{
"property":"Yabox",
"json_obj":{
"prop1":"Nissan",
"prop2":"Welcome Mr. Marshall (Bienvenido Mister Marshall)"
}
}
]
}


Beim Laden in einen Datenrahmen ist „nested_array_to_expand“ eine Zeichenfolge, die den JSON enthält (ich verwende „json_normalize“ während des Ladens). Das erwartete Ergebnis besteht darin, einen Datenrahmen mit 3 Zeilen (im obigen Beispiel) und neuen Spalten für die verschachtelten Objekte wie unten zu erhalten:

index email first_name gender id ip_address last_name \
0 mlantaph0@opensource.org Mead Male 1 231.126.209.31 Lantaph
1 mlantaph0@opensource.org Mead Male 1 231.126.209.31 Lantaph
2 mlantaph0@opensource.org Mead Male 1 231.126.209.31 Lantaph

test.name test.obj.ahah test.obj.buzz
0 Quaxo Mercy Streets Chevrolet
1 Blogpad Flashback Hyundai
2 Yabox Welcome Mr. Marshall (Bienvenido Mister Marshall) Nissan


Ich konnte dieses Ergebnis mit der folgenden Funktion erzielen, aber es war extrem langsam (ungefähr 2 Sekunden für 1.000 Datensätze), daher würde ich gerne entweder den vorhandenen Code verbessern oder einen finden völlig anderer Ansatz, um dieses Ergebnis zu erhalten.

def expand_field(field, df, parent_id='id'):
all_sub = pd.DataFrame()
# we need an id per row to be able to merge back dataframes
# if no id, then we will create one based on index of rows
if parent_id not in df:
df[parent_id] = df.index

# go through all rows and create a new dataframe with values
for i, row in df.iterrows():
try:
sub = json_normalize(df[field].values)
sub = sub.add_prefix(field + '.')
sub['parent_id'] = row[parent_id]
all_sub = all_sub.append(sub)
except:
print('crash')
pass
df = pd.merge(df, all_sub, left_on=parent_id, right_on='parent_id', how='left')
#remove old columns
del df["parent_id"]
del df[field]
#return expanded dataframe
return df


Vielen Dank für Ihre Hilfe.

===== EDIT für die Beantwortung des Kommentars ==== < /p>

Die von mongodb geladenen Daten sind ein Array von Objekten.
Ich lade sie mit dem folgenden Code:

data = json.loads(my_json_string)
df = json_normalize(data)


Die Ausgabe gibt mir einen Datenrahmen mit df["nested_array_to_expand"] als Dtype-Objekt (String)

0 [{'property': 'Quaxo', 'json_obj': {'prop1': '...
Name: nested_array_to_expand, dtype: object

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post