2017-01-30 11 views
4

私はPythonを初めて使っているので、これはかなり簡単かもしれませんが、しばらくの間探しても問題は解決していません。私は辞書のリストからパンダのデータフレームを作成しようとしています。入れ子の辞書のリストからパンダのデータフレームを取得する

ネストされた辞書の私のリストは以下の通りです:

my_list = [{0: {'a': '23', 'b': '15', 'c': '5', 'd': '-1'}, 
      1: {'a': '5', 'b': '6', 'c': '7', 'd': '9'}, 
      2: {'a': '9', 'b': '15', 'c': '5', 'd': '7'}}, 
      {0: {'a': '5', 'b': '249', 'c': '92', 'd': '-4'}, 
      1: {'a': '51', 'b': '5', 'c': '34', 'd': '1'}, 
      2: {'a': '3', 'b': '8', 'c': '3', 'd': '11'}}] 

だから、メイン辞書の各キーは3つの値を持っています。

data = pd.DataFrame(my_list)を使用してこれらをデータフレームに入れると、各セルにはa、b、c、dの情報があるため、使用できないものが返されます。

私はこのようになりますデータフレームで終わるしたい:

name| a | b | c | d 
0 | 23 | 15 | 5 | -1 
1 | 5 | 6 | 7 | 9 
2 | 9 | 15 | 5 | 7 
0 | 5 |249 | 92| -4 
1 |51 | 5 | 34| 1 
2 | 3 | 8 | 3 | 11 

これは可能ですか?

答えて

4

簡単:

pd.concat([pd.DataFrame(l) for l in my_list],axis=1).T 
+0

ありがとうございました!これはうまくいった! – aliki43

1

あなたは、データフレームのコンストラクタにaccetableする辞書のリストをのmungeことができます。

In [4]: pd.DataFrame.from_records([{'name': k, **v} for d in my_list for k,v in d.items()]) 
Out[4]: 
    a b c d name 
0 23 15 5 -1  0 
1 5 6 7 9  1 
2 9 15 5 7  2 
3 5 249 92 -4  0 
4 51 5 34 1  1 
5 3 8 3 11  2 

In [5]: df = pd.DataFrame.from_records([{'name': k, **v} for d in my_list for k,v in d.items()]) 

In [6]: df.set_index('name',inplace=True) 

In [7]: df 
Out[7]: 
     a b c d 
name 
0  23 15 5 -1 
1  5 6 7 9 
2  9 15 5 7 
0  5 249 92 -4 
1  51 5 34 1 
2  3 8 3 11 

これは仕事に{'name':'something', **rest}のためのPythonの比較的最近のバージョンが必要です。 (「サブデータフレーム」の数が多い場合は特に)私の実験では

from itertools import chain 
pd.DataFrame.from_items(list(chain.from_iterable(d.iteritems() for d in my_list))).T 

、これはpd.concatを使用するよりも高速です:

In [13]: reshaped = [] 
    ...: for d in my_list: 
    ...:  for k, v in d.items(): 
    ...:   new = {'name': k} 
    ...:   new.update(v) 
    ...:   reshaped.append(new) 
    ...: 

In [14]: reshaped 
Out[14]: 
[{'a': '23', 'b': '15', 'c': '5', 'd': '-1', 'name': 0}, 
{'a': '5', 'b': '6', 'c': '7', 'd': '9', 'name': 1}, 
{'a': '9', 'b': '15', 'c': '5', 'd': '7', 'name': 2}, 
{'a': '5', 'b': '249', 'c': '92', 'd': '-4', 'name': 0}, 
{'a': '51', 'b': '5', 'c': '34', 'd': '1', 'name': 1}, 
{'a': '3', 'b': '8', 'c': '3', 'd': '11', 'name': 2}] 
+0

ありがとう!これは非常に便利です。 – aliki43

3

別の解決策:これは、単に以下の省略形ですより冗長であるという代償を払ってください。

+0

ありがとう!私がこのコードを試してみると、エラーが出ます:NameError:name 'chain'が定義されていません。理由を知っていますか?さもなければ、私はこのコードの直感を理解していると思う。 – aliki43

+0

申し訳ありませんが、インポートを指定していません。私は標準ライブラリの一部である 'itertools.chain'を使っていました。編集をご覧ください。 –

+0

ありがとうございました!私はpd.concatとこれを試してみます。なぜなら私は多くのデータを扱うことができるからです。 – aliki43

関連する問題