我有这样的字典
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
如何索引键?
答案 0 :(得分: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]
等等。