首页 > 解决方案 > 如何将字典列表和嵌套列表转换为 pandas 数据框以用于降价表生成器?

问题描述

我有以下字典列表(其中包含嵌套列表):

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'}
   ]}
]

我正在尝试使用pytablewriterpandas为此数据生成一个降价表,但我似乎无法处理数据框的唯一值和列排序。

这是我的函数,其中包含此输出的外观示例:

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()

我将如何生成这个?我已经考虑过使用集合来提取唯一的操作系统名称,但这似乎不适用于带有嵌套列表的字典列表。(而且由于数据结构有时只包含一个区域,它需要是动态的)。

任何帮助深表感谢!

标签: pythonpandaslistdictionarymarkdown

解决方案


您可以从规范化 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

推荐阅读