Подтвердить что ты не робот

Как получить доступ к встроенным объектам json в Pandas DataFrame?

TL; DR Если загруженные поля в Pandas DataFrame содержат сами документы JSON, как их можно обрабатывать с помощью Pandas?

В настоящее время я напрямую сбрасываю результаты json/dictionary из библиотеки Twitter (twython) в коллекцию Mongo (называемую здесь пользователями).

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)

После заполнения этой базы данных я прочитал документы в Pandas:

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

Что работает как магия:

Pandas is magic

Я хотел бы иметь возможность калечить поле "статус" Pandas (прямое обращение к атрибутам). Есть ли способ?

status field

EDIT: что-то вроде df ['status: text']. Статус имеет такие поля, как "текст", "created_at". Одним из вариантов может быть сглаживание/нормализация этого json-поля, например этот запрос на растяжение Wes McKinney работал над.

4b9b3361

Ответ 1

Одно из решений состоит в том, чтобы разбить его конструктором Series:

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

В некоторых случаях вам понадобится concat это в DataFrame вместо строки 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

Если это глубже, вы можете сделать это несколько раз...