次のような構造を持つネストされた辞書「user_dict」があるとします。
- レベル1:ユーザーID (長整数)
- レベル2:カテゴリ (文字列)
- レベル3:さまざまな属性 (float、int など)
たとえば、この辞書のエントリは次のようになります。
user_dict[12] = {
"Category 1": {"att_1": 1,
"att_2": "whatever"},
"Category 2": {"att_1": 23,
"att_2": "another"}}
の各項目はuser_dict
同じ構造を持ち、user_dict
属性からシリーズを構築して、pandas DataFrame にフィードする多数の項目が含まれています。この場合、階層インデックスが目的に役立ちます。
具体的には、私の質問は、シリーズが辞書の「レベル 3」の値から構築される必要があることを DataFrame コンストラクターが理解できるようにする方法が存在するかどうかです。
次のようなことを試してみます:
df = pandas.DataFrame(users_summary)
「レベル 1」の項目 (UserId) は列として取得されますが、これは私が達成したいこと (UserId をインデックスとして持つこと) とは逆です。
辞書のエントリを反復処理した後にシリーズを構築できることはわかっていますが、より直接的な方法があれば非常に便利です。同様の質問として、ファイルにリストされている json オブジェクトから pandas DataFrame を構築できるかどうかという質問があります。
ベストアンサー1
pandas MultiIndex はタプルのリストで構成されています。したがって、最も自然なアプローチは、入力辞書のキーが必要なマルチインデックス値に対応するタプルになるように再形成することです。その後、pd.DataFrame.from_dict
オプションを使用して、データフレームを構築できますorient='index'
。
user_dict = {12: {'Category 1': {'att_1': 1, 'att_2': 'whatever'},
'Category 2': {'att_1': 23, 'att_2': 'another'}},
15: {'Category 1': {'att_1': 10, 'att_2': 'foo'},
'Category 2': {'att_1': 30, 'att_2': 'bar'}}}
pd.DataFrame.from_dict({(i,j): user_dict[i][j]
for i in user_dict.keys()
for j in user_dict[i].keys()},
orient='index')
att_1 att_2
12 Category 1 1 whatever
Category 2 23 another
15 Category 1 10 foo
Category 2 30 bar
別の方法としては、コンポーネント データフレームを連結してデータフレームを構築する方法があります。
user_ids = []
frames = []
for user_id, d in user_dict.iteritems():
user_ids.append(user_id)
frames.append(pd.DataFrame.from_dict(d, orient='index'))
pd.concat(frames, keys=user_ids)
att_1 att_2
12 Category 1 1 whatever
Category 2 23 another
15 Category 1 10 foo
Category 2 30 bar