You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 05:55:15