将字典转换为以元组为键的数据框

3 投票
1 回答
2119 浏览
提问于 2025-05-10 15:31

我有一个字典,长得像这样:

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] 这样来访问了。

撰写回答