Создание таблицы из вложенных словарей Python с отсутствующими значениями

Вот текущая структура данных, которая у меня есть:

{'bin1': {'A': 14545,
          'B': 18579,
          'C': 5880,
          'D': 20771,
          'E': 404396},
 'bin2': {'A': 13200,
          'B': 12279,
          'C': 5000,
          'D': 16766,
          'E': 200344},
 [...] }

И я хотел бы написать в таблицу в форме:

        A     B     C    D     E    
bin1  14545 18579 5880 20771 494396
bin2  13200 12279 5000 16766 200344
...

В настоящее время я использую грубый цикл печати (где d == словарь, описанный выше):

# print the table header
labs = [i for i in d[d.keys()[0]]]
print "bin" + "\t" + "\t".join(labs)

# loop and print the values
for j in d:
    print j + "\t" + "\t".join(map(str, [d[j][q] for q in d[j]]))

Что, казалось, работало (несмотря на то, что оно явно неупорядочено), однако в моем выводе я обнаружил, что некоторые вложенные словари не содержат все поля AE. Я предполагаю, что один из способов сделать это - перестроить словарь, возможно, используя более подходящую структуру данных матричного типа, и заполнить недостающие значения с помощью 0, но, учитывая, что у меня есть этот огромный вложенный словарь, есть ли более разумный способ печати вывод, показанный выше, который может обрабатывать отсутствующие элементы?


person blmoore    schedule 11.09.2013    source источник


Ответы (2)


Используя панды:

import pandas as pd

data = {'bin1': {'A': 14545,
          'B': 18579,
          'C': 5880,
          'D': 20771,
          'E': 404396},
        'bin2': {'A': 13200,
          'D': 16766,
          'E': 200344},
        }

df = pd.DataFrame(data).T
df.fillna(0, inplace=True)
print(df)

отпечатки

          A      B     C      D       E
bin1  14545  18579  5880  20771  404396
bin2  13200      0     0  16766  200344

df.fillna(0) заменяет отсутствующие значения на 0.

person unutbu    schedule 11.09.2013

Вы можете использовать d[j].get(q, '0') вместо d[j][q], чтобы заполнить 0 для всех отсутствующих записей:

# print the table header
labs = sorted(max(d.values(), key=len))
print "bin" + "\t" + "\t".join(labs)

# loop and print the values
for j in d:
    print j + "\t" + "\t".join(str(d[j].get(q, '0')) for q in labs)

Я также внес небольшие изменения в другие части кода, чтобы столбцы были упорядочены.

person Andrew Clark    schedule 11.09.2013
comment
Он мог бы использовать dict.get() без дополнительных затрат на создание временного defaultdict: j + "\t" + "\t".join(str(d[j].get(q, '')) for q in labs). - person Robᵩ; 11.09.2013
comment
Разве значение по умолчанию для get не должно быть целым числом 0, а не строкой '0'? - person Steven Rumbalski; 11.09.2013
comment
В любом случае он преобразуется в строку, любой из них будет работать, но установка его в '0' для начала должна быть немного быстрее. - person Andrew Clark; 11.09.2013
comment
Если первый словарь, возвращаемый d.values(), неполный (отсутствует пара ключ-значение), не приведет ли это к отсутствию столбцов? - person Steven Rumbalski; 11.09.2013
comment
Я пропустил более позднее преобразование в строку. - person Steven Rumbalski; 11.09.2013