Датафреймы и панды - PullRequest
0 голосов
/ 27 июня 2018

Я работаю со словарем, в котором хранится несколько словарей. Это выглядит так (этот довольно укороченный).

dict = {('random_number_1', 'random_number_2'): {'random_string_1': 'random_number_3'}, ('random_number_1', 'random_number_4'): {'random_string_2': 'random_number_5'}, ('random_number_1', 'random_number_6'): {'random_string_3': 'random_number_7', 'random_string_4': 'random_number_8', 'random_string_5': 'random_number_10'}}

{('random_number_11','random_number_13'): {'random_string_6': 'random_number_14', 'random_string_7': 'random_number_15'}}

Я хочу написать файл Excel, который бы выглядел так. Пример

Я использовал код:

newdict = {(k1, k2):v2 for k1,v1 in dict.items() \
                   for k2,v2 in dict[k1].items()}


df = pd.DataFrame([newdict[i] for i in sorted(newdict)],
              index=pd.MultiIndex.from_tuples([i for i in sorted(newdict.keys())]))

и попытался создать с ним dataframe, это выглядит удовлетворительно, но когда я не хочу писать это, чтобы преуспеть (с df.to_excel () я получаю ошибку: Msgstr "Неподдерживаемый тип 'tuple' в write ()". Я думаю, что проблема заключается в моем фрейме данных. Когда я распечатываю это выглядит так.

                                 0
(random_number_1, random_number_2) random_string_1 random_number_3

(random_number_1, random_number_4) random_string_2 random_number_5

(random_number_1, random_number_6) random_string_3 random_number_7

                                   random_string_4 random_number_8

                                   random_string_5 random_number_9    
                                  0
(random_number_10, random_number_11) random_string_6 random_number_12

                                    random_string_7 random_umber_13

Эти 0 находятся в конце строки. Ps: извините за неправильную публикацию моего кода. Не знал, как сделать отступы без кода. Надеюсь, я не заставил кого-то слишком много работать с редактированием. Заранее спасибо.

1 Ответ

0 голосов
/ 27 июня 2018

Не уверен, что это лучший способ, но, по крайней мере, там, где вы находитесь с определением df, вам нужно сбросить уровень индекса, а затем изменить индекс с кортежей на мультииндекс. С вашим newdict затем выполните:

df = (pd.DataFrame( [newdict[i] for i in sorted(newdict)],
                    index=pd.MultiIndex.from_tuples([i for i in sorted(newdict.keys())]))
        .reset_index(level=1) # to make random_string as a column not a level of index
        .rename(columns={'level_1':'string',0:'number'})) #this is cosmetic. not necessary
df.index = pd.MultiIndex.from_tuples(df.index) # create the multiindex from current tuples in index

df похоже на

                                            string            number
random_number_1  random_number_2   random_string_1   random_number_3
                 random_number_4   random_string_2   random_number_5
                 random_number_6   random_string_3   random_number_7
                 random_number_6   random_string_4   random_number_8
                 random_number_6   random_string_5  random_number_10
random_number_11 random_number_13  random_string_6  random_number_14
                 random_number_13  random_string_7  random_number_15

, которые дают вам что-то близкое к тому, что вы хотите, когда делаете df.to_excel

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...