如何将Pandas DataFrame转换为指定结构的嵌套字典?
Pandas DataFrame转指定嵌套字典的实现方案
原始DataFrame
import pandas as pd df = pd.DataFrame({ 'school_name': ['ABC', 'ABC', 'ABC', 'DEF', 'DEF', 'DEF', 'XYZ', 'XYZ'], 'student_name': ['joey', 'andrew', 'phill', 'joey1', 'andrew1', 'phill1', 'joey2', 'phill2'], 'address': ['london', 'califor', 'los A', 'london1', 'califor1', 'los A1', 'autria', 'autria'], 'phone': [5685, 5688, 5687, 56858, 56878, 56987, 4455, 6655] }) print(df)
输出:
school_name student_name address phone 0 ABC joey london 5685 1 ABC andrew califor 5688 2 ABC phill los A 5687 3 DEF joey1 london1 56858 4 DEF andrew1 califor1 56878 5 DEF phill1 los A1 56987 6 XYZ joey2 autria 4455 7 XYZ phill2 autria 6655
目标嵌套字典结构
{ 'ABC': {'student_name': ['joey', 'andrew', 'phill'], 'address': ['london', 'califor', 'los A'], 'phone': [5685, 5688, 5687]}, 'DEF': {'student_name': ['joey1', 'andrew1', 'phill1'], 'address': ['london1', 'califor1', 'los A1'], 'phone': [56858, 56878, 56987]}, 'XYZ': {'student_name': ['joey2', 'phill2'], 'address': ['autria', 'autria'], 'phone': [4455, 6655]} }
解决方法
方法1:一行代码实现(groupby + to_dict)
利用Pandas的groupby分组后,结合apply和to_dict('list')直接生成目标结构:
result = df.groupby('school_name').apply(lambda x: x.drop('school_name', axis=1).to_dict('list')).to_dict()
- 逻辑说明:按
school_name分组后,对每个分组删除school_name列,再将分组内的每一列转为列表形式的字典,最后把分组结果整体转为字典。
方法2:分步实现(更直观)
如果觉得lambda不够直观,可以用循环遍历分组:
result = {} # 按school_name分组 for school, group_df in df.groupby('school_name'): # 移除分组列,将剩余列转为列表字典 result[school] = group_df.drop('school_name', axis=1).to_dict('list')
常见问题说明
如果之前用列表推导式结合groupby没成功,大概率是没正确处理分组后的DataFrame结构:比如没有移除school_name列,或者错误地使用了分组后的索引/键值,导致生成的字典结构不符合预期。上述两种方法都明确处理了分组列的移除,确保输出结构匹配需求。
内容的提问来源于stack exchange,提问作者tech_guy
相关产品推荐
相关产品推荐

