¿Cómo accedo a los objetos json incrustados en un Pandas DataFrame?

TL; DR Si los campos cargados en un Pandas DataFrame contienen documentos JSON en sí mismos, ¿cómo se pueden trabajar con Pandas?

Actualmente estoy descargando directamente los resultados de json / dictionary de una biblioteca de Twitter ( twython ) en una colección de Mongo (llamada usuarios aquí).

from twython import Twython from pymongo import MongoClient tw = Twython(......) # Using mongo as object storage client = MongoClient() db = client.twitter user_coll = db.users user_batch = ... # collection of user ids user_dict_batch = tw.lookup_user(user_id=user_batch) for user_dict in user_dict_batch: if(user_coll.find_one({"id":user_dict['id']}) == None): user_coll.insert(user_dict) 

Después de poblar esta base de datos, leí los documentos en Pandas:

 # Pull straight from mongo to pandas cursor = user_coll.find() df = pandas.DataFrame(list(cursor)) 

Que funciona como magia:

Pandas es magia

Me gustaría poder destrozar el estilo Pandas del campo ‘estado’ (accediendo directamente a los atributos). ¿Hay alguna manera?

campo de estado

EDITAR: Algo como df [‘estado: texto’]. El estado tiene campos como ‘texto’, ‘created_at’. Una opción podría ser aplanar / normalizar este campo json como esta solicitud de extracción en la que estaba trabajando Wes McKinney.

Una solución es simplemente romperlo con el constructor de la serie:

 In [1]: df = pd.DataFrame([[1, {'a': 2}], [2, {'a': 1, 'b': 3}]]) In [2]: df Out[2]: 0 1 0 1 {u'a': 2} 1 2 {u'a': 1, u'b': 3} In [3]: df[1].apply(pd.Series) Out[3]: ab 0 2 NaN 1 1 3 

En algunos casos, querrá adaptar esto al DataFrame en lugar de la fila dict:

 In [4]: dict_col = df.pop(1) # here 1 is the column name In [5]: pd.concat([df, dict_col.apply(pd.Series)], axis=1) Out[5]: 0 ab 0 1 2 NaN 1 2 1 3 

Si se profundiza, puedes hacerlo varias veces …