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.

È stato utile?

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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
scroll top