如何将pd.DataFrame中字典列表列转换为新列(未知键名及数量)
解决方法
方法一:利用apply分组转换
先将metadata列的每个字典列表转为小DataFrame,再通过分组把key转成列名,最后和原date列合并:
import pandas as pd # 构造示例数据 data = { 'date': ['2022-12-03', '2022-12-07', '2022-12-02', '2022-12-01'], 'metadata': [ [{'key': 'key1', 'value': 'value0.1'}, {'key': 'key2', 'value': 'value0.2'}, {'key': 'key3', 'value': 'value0.3'}], [{'key': 'key1', 'value': 'value1.1'}, {'key': 'key2', 'value': 'value1.2'}, {'key': 'key3', 'value': 'value1.3'}], [{'key': 'key1', 'value': 'value2.1'}, {'key': 'key2', 'value': 'value2.2'}, {'key': 'key3', 'value': 'value2.3'}], [{'key': 'key1', 'value': 'value3.1'}, {'key': 'key2', 'value': 'value3.2'}, {'key': 'key3', 'value': 'value3.3'}] ] } df = pd.DataFrame(data) # 处理metadata列 metadata_df = df['metadata'].apply(pd.DataFrame).reset_index() metadata_pivoted = metadata_df.groupby('index').apply( lambda x: x.set_index('key')['value'].to_frame().T ).reset_index(drop=True) # 合并结果 result = pd.concat([df['date'], metadata_pivoted], axis=1) print(result)
方法二:用explode+pivot更简洁
先把字典列表拆成单行,再将字典展开为列,最后通过透视把key转为列:
import pandas as pd # 构造示例数据(同上) data = { 'date': ['2022-12-03', '2022-12-07', '2022-12-02', '2022-12-01'], 'metadata': [ [{'key': 'key1', 'value': 'value0.1'}, {'key': 'key2', 'value': 'value0.2'}, {'key': 'key3', 'value': 'value0.3'}], [{'key': 'key1', 'value': 'value1.1'}, {'key': 'key2', 'value': 'value1.2'}, {'key': 'key3', 'value': 'value1.3'}], [{'key': 'key1', 'value': 'value2.1'}, {'key': 'key2', 'value': 'value2.2'}, {'key': 'key3', 'value': 'value2.3'}], [{'key': 'key1', 'value': 'value3.1'}, {'key': 'key2', 'value': 'value3.2'}, {'key': 'key3', 'value': 'value3.3'}] ] } df = pd.DataFrame(data) # 展开字典列表 exploded = df.explode('metadata') # 将字典转为列 exploded = pd.concat([exploded['date'], pd.json_normalize(exploded['metadata'])], axis=1) # 透视转换格式 result = exploded.pivot(index='date', columns='key', values='value').reset_index() result.columns.name = None # 移除列名的层级标签 print(result)
两种方法都能自动识别所有key的名称和数量,不需要提前指定,最终输出结果符合需求。
内容的提问来源于stack exchange,提问作者user20701170
相关产品推荐
相关产品推荐

