将字典转换为Dataframe,将元组作为键

时间:2015-11-19 13:46:50

标签: python pandas

我有这样的字典

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 个答案:

答案 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]等等。