Как я могу преобразовать список словарей и вложенных списков в pandas Dataframe для использования в генераторе таблиц уценки? - PullRequest
0 голосов
/ 25 мая 2020

У меня есть следующий список словарей (с вложенными списками внутри):

compatibility = [
  {'region': 'NTSC-U',
   'stats': [
     {'os': 'Windows', 'state': 'Playable'}, 
     {'os': 'Linux', 'state': 'Playable'},
     {'os': 'Mac', 'state': 'N/A'}
   ]}, 
   {'region': 'PAL',
    'stats': [
      {'os': 'Windows', 'state': 'Playable'},
      {'os': 'Linux', 'state': 'N/A'},
       {'os': 'Mac', 'state': 'N/A'}
    ]}, 
    {'region': 'NTSC-J',
     'stats': [
       {'os': 'Windows', 'state': 'N/A'}, 
       {'os': 'Linux', 'state': 'N/A'},
       {'os': 'Mac', 'state': 'N/A'}
   ]}
]

Я пытаюсь использовать pytablewriter и pandas для создания таблицы уценки для этих данных, но я могу Кажется, мне не приходится разбираться с уникальными значениями и порядком столбцов для фрейма данных.

Вот моя функция с примером того, как будет выглядеть этот вывод:

def generate_table():
    compatibility = find_compatibility()
    writer = MarkdownTableWriter()
    writer.from_dataframe(
        pd.DataFrame({'NTSC-U': ['Playable', 'Playable', 'N/A'], 'PAL': ['Playable', 'N/A', 'N/A'], 
                      'NTSC-J': ['N/A', 'N/A', 'N/A']}, index=['Windows', 'Linux', 'Mac']),
        add_index_column=True,
    )
    writer.write_table()

Как бы Я go об этом? Я дошел до того, что подумал о наборах для получения уникальных имен ОС, но, похоже, это не работает со списком dicts с вложенными списками. (И поскольку структура данных иногда содержит только одну область, это должно быть динамическое c).

Любая помощь приветствуется!

1 Ответ

1 голос
/ 26 мая 2020

Вы можете начать с нормализации вашего json, выбрав 'stats' в качестве пути записи.

df = pd.json_normalize(compatibility, "stats", ["region"])
print(df)
        os     state  region
0  Windows  Playable  NTSC-U
1    Linux  Playable  NTSC-U
2      Mac       N/A  NTSC-U
3  Windows  Playable     PAL
4    Linux       N/A     PAL
5      Mac       N/A     PAL
6  Windows       N/A  NTSC-J
7    Linux       N/A  NTSC-J
8      Mac       N/A  NTSC-J

Затем вы просто используете pivot для получения желаемого результата.

df = df.pivot("os", "region", values="state")
print(df)
region  NTSC-J    NTSC-U       PAL
os                                
Linux      N/A  Playable       N/A
Mac        N/A       N/A       N/A
Windows    N/A  Playable  Playable
...