15

TL;DR Pandas DataFrame にロードされたフィールドに JSON ドキュメント自体が含まれている場合、Pandas のような方法でどのように操作できますか?

現在、私は json/dictionary の結果を Twitter ライブラリ ( twython ) から Mongo コレクション (ここでは users と呼ばれます) に直接ダンプしています。

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 スタイル (属性に直接アクセス) をマングルできるようにしたいと考えています。方法はありますか?

ステータス フィールド

編集: df['status:text'] のようなもの。ステータスには「text」、「created_at」などのフィールドがあります。Wes McKinney が取り組んでいたこのプル リクエストのように、この json フィールドをフラット化/正規化することが 1 つのオプションです。

4

1 に答える 1

22

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

場合によっては、これを dict 行の代わりに DataFrame に連結する必要があります。

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

深くなると、これを数回行うことができます...

于 2013-09-06T20:32:29.603 に答える