将字典转换为以元组为键的数据框
我有一个字典,长得像这样:
df_dict = {(7, 'hello'): {1}, (1, 'fox'): {2}}
我想把它转换成一个数据框(dataframe),其中元组的第一部分作为行标题,第二部分作为列标题。我试过这样做:
doc_df = pd.DataFrame(df_dict, index=[df_dict.keys()[0]], columns = [df_dict.keys()[1]])
但是我遇到了一个错误,错误信息是 TypeError: 'dict_keys' object does not support indexing
我希望我的数据框看起来像这样:
_ | fox | hello
1 | 2 | null
7 | null | 1
我该如何访问这些键呢?
相关文章:
- 暂无相关问题
1 个回答
4
你遇到的 TypeError
错误是因为 df_dict.keys()
返回的是一个迭代器,它会一个一个地给你字典里的键。它会依次返回 (7, 'hello')
和 (1, 'fox')
,但它并不知道这些内容。这个迭代器本身并不知道有多少个元素,也不知道这些元素的结构是什么,特别是它无法通过索引来访问某个特定的元素。
现在,你可以使用 itertools.islice
函数来访问可迭代对象中的某个特定元素,但这样做会丢掉之前的所有元素。所以这并不是你想要的。
你想问的问题是如何索引这些键,解决办法是先把它们转换成一个列表:
l = list(df_dict.keys())
然后你就可以用 l[0]
和 l[1]
这样来访问。
但即便如此,这也不是你实际需要的。在你的例子中,得到的列表会是:
[(7, 'hello'), (1, 'fox')]
所以 l[0]
会是 (7, 'hello')
,而 l[1]
会是 (1, 'fox')
(顺序可能会反过来,因为你不知道键的输出顺序)。你真正想要访问的是 (7, 1)
和 ('hello', 'fox')
,为此你需要使用类似列表推导式的方式:
[x[0] for x in l] # (7, 1)
[x[1] for x in l] # ('hello', 'fox')
或者你可以把它转换成一个 NumPy 数组,然后进行转置。
npl = numpy.array(l) # array([[7, 'hello'], [1, 'fox']])
nplT = npl.T # array([[7, 1], ['hello', 'fox']])
现在你就可以用 nplT[0]
这样来访问了。