Pandas构建按Activity、Protocol ID分层嵌套字典存储DataFrame
问题描述
- 待处理的大型DataFrame包含
Index、Protocol ID、Activity ID、Detail 1、Detail 2共5个字段,数据存在三类特殊情况:- 同一
Activity ID对应多个Protocol ID - 部分
Activity ID取值为NaN - 部分
Protocol ID取值为TBD
- 同一
- 目标结构为三层嵌套字典:
- 最外层键为
Activity ID,对应值为该Activity下的协议二级字典 - 二级字典键为
Protocol ID,对应值为存储该协议关联所有原始列完整信息的DataFrame
- 最外层键为
- 原有实现缺陷:使用代码
activity_dict = initial_dataframe.set_index('Activity ID').T.to_dict('dict')生成的字典,访问指定Activity时仅返回最后一个Protocol的关联信息,例如执行activity_dict["159"]仅返回协议1174的字段内容,无法展示该Activity下636、787、796等全部关联协议对应的DataFrame。
问题原因
原有代码的逻辑是将Activity ID设为唯一索引后直接转字典,pandas处理重复索引转字典时会直接覆盖前序同索引的取值,因此同个Activity下的多个Protocol条目只会保留最后一条,完全无法生成要求的二层嵌套结构。
正确实现方案
通过两次分组遍历实现嵌套结构,dropna=False参数保证NaN值的Activity、TBD/NaN值的Protocol不会被过滤丢弃:
# 初始化最外层字典 activity_dict = {} # 第一次按Activity ID分组,遍历所有Activity for activity_id, act_df in initial_dataframe.groupby('Activity ID', dropna=False): protocol_dict = {} # 第二次在当前Activity分组内按Protocol ID分组 for protocol_id, proto_df in act_df.groupby('Protocol ID', dropna=False): # 保留所有原始列,重置索引避免冗余索引问题 protocol_dict[protocol_id] = proto_df.reset_index(drop=True) activity_dict[activity_id] = protocol_dict
如果偏好简洁写法,也可以用字典推导式实现完全相同的效果:
activity_dict = { act_id: { proto_id: proto_df.reset_index(drop=True) for proto_id, proto_df in act_group.groupby('Protocol ID', dropna=False) } for act_id, act_group in initial_dataframe.groupby('Activity ID', dropna=False) }
效果验证
- 执行
activity_dict["159"]将返回Activity 159对应的二级协议字典,包含该Activity下636、787、796、1174等所有关联Protocol ID作为键 - 执行
activity_dict["159"][636]即可获取Protocol 636对应的所有原始字段完整DataFrame - 同一Activity+Protocol组合下如果存在多条记录,会自动合并到同一个DataFrame中,不会丢失数据
内容的提问来源于stack exchange,提问作者elle.delle
相关产品推荐
相关产品推荐

