我有一个像这样的字典:
d[id1][id2] = value
例:
books["auth1"]["humor"] = 20
books["auth1"]["action"] = 30
books["auth2"]["comedy"] = 20
等等..
每个“auth”键可以具有与它们相关联的任何“类型”。键控项目的值是他们编写的书籍数量。
现在我想要的是以矩阵的形式转换它...类似于:
"humor" "action" "comedy"
"auth1" 20 30 0
"auth2" 0 0 20
我该怎么做呢?谢谢
使用列表推导将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添加到列表中。
pandas做得很好:
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
在2018年,我认为Pandas 0.22支持这个out of the box。具体来说,请检查from_dict
的DataFrame
类方法。
books = {}
books["auth1"] = {}
books["auth2"] = {}
books["auth1"]["humor"] = 20
books["auth1"]["action"] = 30
books["auth2"]["comedy"] = 20
pd.DataFrame.from_dict(books, orient='columns', dtype=None)