如何将Pandas DataFrame中eval_values列的字典拆分为多行
解决Pandas拆分字典列到多行的KeyError问题
问题根源
- eval_values列处理错误:你用
json.dumps(x)处理该列完全错误——如果这列是单引号格式的字符串字典,json.dumps会把它转成带转义的字符串,导致后续无法解析为指标列;如果已经是Python字典,json.dumps会把它转为字符串,同样无法展开。 - 列名大小写/拼写不匹配:原DataFrame列名是
eval_metrics、eval_values,但代码里写成了EvaluationMetrics、eval_Values;同时value_vars里的指标名(如falsePositiveRate)和实际字典里的falsepositiverate大小写不一致,导致找不到列。
正确解决方案
先导入ast模块(用于解析字符串格式的Python字典),然后按以下步骤执行:
import pandas as pd import ast # 1. 将eval_values转换为Python字典(如果列是字符串格式的字典才需要这步,已是字典则跳过) df['eval_values'] = df['eval_values'].apply(ast.literal_eval) # 2. 展开字典列为单独的指标列 expanded_metrics = df['eval_values'].apply(pd.Series) # 3. 合并原DataFrame的其他列与展开的指标列 df = pd.concat([df.drop('eval_values', axis=1), expanded_metrics], axis=1) # 4. 打印当前列名,确认指标列的实际名称(避免拼写/大小写错误) print("当前所有列:", df.columns.tolist()) # 5. 转换为多行格式,确保id_vars和value_vars的列名完全匹配 df = pd.melt( df, id_vars=['resource_name', 'version_id', 'create_time', 'update_time', 'eval_metrics'], # 这里填写实际存在的指标列名,和字典里的键完全一致 value_vars=['falsepositiverate', 'falsepositivecount', 'truepositivecount', 'precisionAt1', 'precision', 'f1score', 'recall'], var_name='metric', value_name='value' ) # 可选:过滤掉空值(部分记录可能缺少某些指标) df = df.dropna(subset=['value']) print(df)
额外说明
- 如果你的
eval_values列本来就是Python字典类型,直接删除ast.literal_eval那一行即可。 - 执行
print(df.columns.tolist())是关键,可以帮你确认展开后的指标列名称,避免因大小写、拼写错误导致的KeyError。
内容的提问来源于stack exchange,提问作者akredd
相关产品推荐
相关产品推荐

