with seleccionar recorrer ordering non may lead json_normalize from dicts data columnas column python json mongodb twitter pandas

python - seleccionar - recorrer data frame pandas



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

TL; DR Si los campos cargados en un Pandas DataFrame contienen documentos JSON, ¿cómo se puede trabajar de forma similar a los pandas?

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

from twython import Twython from pymongo import MongoClient tw = Twython(...<auth>...) # 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:

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

EDITAR: Algo así como df [''status: text'']. El estado tiene campos como ''text'', ''created_at''. Una opción podría ser aplastar / normalizar este campo JSON, como esta solicitud de extracción en la que Wes McKinney estaba trabajando.


Una solución es simplemente aplastarla 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]: a b 0 2 NaN 1 1 3

En algunos casos, deseará concaturar 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 a b 0 1 2 NaN 1 2 1 3

Si se profundiza, puedes hacer esto unas cuantas veces ...