Конвертировать сложный словарь данных в фреймы данных - PullRequest
0 голосов
/ 04 апреля 2019

у меня есть следующий словарь:

 {
   'process':{
      'state':'running',
      'username':'abc',
      'ppid':624,
      'cpu':{
         'total':{
            'pct':0.0
         },
         'start_time':'2019-03-14'
      },
      'cmdline':'acde',
      'pgid':0,
      'name':'xct',
      'memory':{
         'size':3608576,
         'rss':{
            'bytes':28897280,
            'pct':0.0008
         },
         'share':0
      },
      'pid':696
   }
}

Ожидается увидеть:

state   username    ppid    pct start_time  cmdline pgid    name    size    bytes   pct share   pid
running abc 624 0   03/14/2019  acde    0   xct 3608576 28897280    0.0008  0   696

пожалуйста, обратите внимание, я проигнорировал это:

  process
   cpu
    total
   rss

потому что они являются словарями данных (откуда я получаю значения, поэтому мне все равно и их можно игнорировать)

1 Ответ

0 голосов
/ 05 апреля 2019

Я не знаю об автоматическом способе сделать это, но это, кажется, работает:

Этот метод 'выравнивает словарь (извлекает все внутренние словари)

def flatten_dict(d):
    flat = []
    for k,v in d.items():
        if (isinstance(v,dict)):
            flat.extend(flatten_dict(v))
        else:
            flat.append((k,v))
    return flat

Тогда выможете использовать это для генерации ряда (из dict) и преобразования его в кадр данных, который вы показываете в своем OP:

pd.DataFrame(pd.Series({a:b for a,b in flatten_dict(data)})).transpose()

(где data - ваш оригинальный вложенный словарь)

Вывод, который я получил:

state   username    ppid    pct start_time  cmdline pgid    name    size    bytes   share   pid
0   running abc 624 0.0008  2019-03-14  acde    0   xct 3608576 28897280    0   696

Обратите внимание, что pct появляется дважды, и это приводит к тому, что один из них перезаписывает другой - вы можете преодолеть это, не преобразовав окончательный вывод метода (список кортежей) в словарь - ваш короткий пост недостаточно конкретен, чтобы точно понять, что вы хотите на этом уровне детализации.

Пожалуйста, дайте мне знать, если что-то не понятно или не работает какожидается.

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