2015-11-19 1 views
2

У меня есть словарь, как этотПреобразование словаря в Dataframe с кортежем в качестве ключевых

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

Я хочу, чтобы мой dataframe выглядеть следующим образом:

_ | fox | hello 
1 | 2 | null 
7 | null | 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] и так далее.

Смежные вопросы