使用pandas将CSV读取的DataFrame按索引列转为目标嵌套字典
Pandas DataFrame 转指定嵌套字典实现方案
你不需要单独依赖set_index()实现这个转换,以下两种方案都可以满足需求:
方案1:完全匹配你给出的期望输出格式
核心逻辑是先按indexes列分组,逐组将每行的X、Y值拼接为单键值对字典,再汇总为对应键的列表值,代码如下:
import pandas as pd # 你已有的CSV读取逻辑 df = pd.read_csv("my_file.csv") target_dict = {} # 按indexes列分组,sort=False保留原表中index的出现顺序 for group_key, group_df in df.groupby("indexes", sort=False): # 逐行生成{X_values: Y_values}格式的字典,收集为列表 kv_pairs = [{row["X_values"]: row["Y_values"]} for _, row in group_df.iterrows()] target_dict[group_key] = kv_pairs
运行后输出的结构和你给出的示例完全一致:
{ "IDX1" : [{"x1": "y1"}, {"x2": "y2"}, {"x3": "y3"}, {"x4": "y4"}], "IDX2": [{"x1": "y1"},{"x4": "y4"}], "IDX3":[{"x1": "y1"}, {"x2": "y2"}] }
方案2:更简洁的替代嵌套结构
如果不强制要求每个X-Y键值对单独封装为字典,可以用更精简的代码生成少一层嵌套的结构,后续取值效率更高:
# 输出结构:{index值: {x1:y1, x2:y2, ...}} target_dict_alt = df.groupby("indexes", sort=False).apply( lambda x: dict(zip(x["X_values"], x["Y_values"])) ).to_dict()
该结构输出如下,取值时不需要遍历列表,直接通过target_dict_alt["IDX1"]["x1"]即可拿到对应y值,日常使用更方便:
{ "IDX1": {"x1": "y1", "x2": "y2", "x3": "y3", "x4": "y4"}, "IDX2": {"x1": "y1", "x4": "y4"}, "IDX3": {"x1": "y1", "x2": "y2"} }
说明:你之前单独用
set_index()无法实现需求的原因是,该方法仅会将指定列设置为行索引,不会自动完成同索引行的分组聚合、行数据转字典的逻辑,必须配合分组操作才能收拢同一index对应的多行数据。
内容的提问来源于stack exchange,提问作者YggY
相关产品推荐
相关产品推荐

