Pandas: campi di accesso all'interno del campo in un dataframe
Domanda
Supponiamo che io sono come un file JSON:
[
{
"id": "0",
"name": "name0",
"first_sent": "date0",
"analytics": [
{
"a": 1,
...
},
{
"a": 2,
...
}
]
}
]
e voglio analizzarlo con i panda. Così ho caricarlo con
df = pd.read_json('file.son')
E 'tutto bene fino a quando provo ad accedere e contare il numero di dizionari nel campo "analytics" per ogni elemento, per cui compito non ho trovato un modo migliore di
for i in range(df.shape[0]):
num = len(df[i:i+1]['analytics'][i])
Ma questo sembra totalmente non-elegante e manca il punto di utilizzare Panda, in primo luogo. Ho bisogno di essere in grado di accedere ai campi all'interno di "analisi" per ogni elemento. La domanda è come usare Panda ai campi di accesso all'interno di un campo (che associa a un oggetto della serie), senza ritornare alla non-panda approcci.
Una testa di sguardi dataframe come questo (solo campi 'id' e 'analisi' ha riferito):
0 [{u'a': 0.0, u'b...
1 [{u'a': 0.01, u'b...
2 [{u'a': 0.4, u'b...
3 [{u'a': 0.2, u'b...
Name: analytics, dtype: object
0 '0'
1 '1'
2 '2'
3 '3'
Il primo numero è ovviamente l'indice, la stringa è il 'id', ed è chiaro che appare 'analisi' come una serie.
Soluzione
Multi-indicizzazione potrebbe essere utile. Vedere questo:
http://pandas.pydata.org/pandas-docs/stable/ advanced.html
Ma il seguito è stata la soluzione immediata che è venuto in mente. Penso che sia un po 'più elegante di quello che si avvicinò con (meno numeri oscuri, più interpretabile linguaggio naturale):
import pandas as pd
df = pd.read_json('test_file.json')
df = df.append(df) # just to give us an extra row to loop through below
df.reset_index(inplace=True) # not really important except to distinguish your rows
for _ , row in df.iterrows():
currNumbDict = len(row['analytics'])
print(currNumbDict)