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

3
我有一个像这样的字典
df_dict = {(7, 'hello'): {1}, (1, 'fox'): {2}}

我希望将其转换为一个数据框,其中元组的第一部分是行标题,第二部分是列标题。我尝试了以下方法:
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() 是一个迭代器,它逐个从 dict 中返回键。它返回的元素将是 (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]等等。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接