21

私はこのような巨大な辞書を持っています:

d[id1][id2] = value

例:

books["auth1"]["humor"] = 20
books["auth1"]["action"] = 30
books["auth2"]["comedy"] = 20

等々..

各「認証」キーには、それらに関連付けられた「ジャンル」の任意のセットを含めることができます。キー付きアイテムの値は、彼らが書いた本の数です。

今私が欲しいのはそれを行列の形に変換することです...次のようなものです:

                    "humor"       "action"        "comedy"
      "auth1"         20            30               0
      "auth2"          0            0                20

どうすればこれを行うことができますか?ありがとう

4

3 に答える 3

27

パンダはこれを非常にうまくやっています:

books = {}
books["auth1"] = {}
books["auth2"] = {}
books["auth1"]["humor"] = 20
books["auth1"]["action"] = 30
books["auth2"]["comedy"] = 20

from pandas import *

df = DataFrame(books).T.fillna(0)

出力は次のとおりです。

       action  comedy  humor
auth1      30       0     20
auth2       0      20      0
于 2012-05-17T01:12:16.317 に答える
10

リスト内包表記を使用して、dict をリストのリストおよび/または numpy 配列に変換します。

np.array([[books[author][genre] for genre in sorted(books[author])] for author in sorted(books)])

編集

どうやら、各サブ辞書に不規則な数のキーがあります。すべてのジャンルのリストを作成します。

genres = ['humor', 'action', 'comedy']

そして、通常の方法で辞書を反復処理します。

list_of_lists = []
for author_name, author in sorted(books.items()):
    titles = []
    for genre in genres:
        try:
            titles.append(author[genre])
        except KeyError:
            titles.append(0)
    list_of_lists.append(titles)

books_array = numpy.array(list_of_lists)

基本的に、各キーの値をリストに追加しようとしていますgenres。キーがそこにない場合、エラーがスローされます。エラーをキャッチし、代わりにリストに 0 を追加します。

于 2012-05-16T17:42:56.717 に答える