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 ...