如何将Pandas DataFrame按组转为列作键的字典?能否用df.to_dict()?
Pandas DataFrame转指定分组字典的实现方案
需求说明
需要将Pandas DataFrame转换为嵌套字典结构:
- 外层字典键为分组后的组名
- 内层字典键为原DataFrame的列名,值为对应列的行值列表(支持保留重复值,或对指定列去重)
同时想确认是否可以直接用df.to_dict()方法实现该需求。
示例数据
team id name salary 0 Alpha 10 Jack 1000 1 Alpha 15 John 2000 2 Alpha 20 John 2000 3 Bravo 50 Thomas 5000 4 Bravo 55 Robert 6000 5 Bravo 60 Albert 7000
示例代码
import pandas as pd d = {'team': ['Alpha', 'Alpha', 'Alpha', 'Bravo', 'Bravo', 'Bravo'], 'id': [10, 15, 20, 50, 55, 60], 'name': ['Jack', 'John', 'John', 'Thomas', 'Robert', 'Albert'], 'salary': [1000, 2000, 2000, 5000, 6000, 7000]} df = pd.DataFrame(data=d)
预期输出
保留重复值的预期输出
ex = {'Alpha': {'id': [10, 15, 20], 'name': ['Jack', 'John', 'John'], 'salary': [1000, 2000, 2000]}, 'Bravo': {'id': [50, 55, 60], 'name': ['Thomas', 'Robert', 'Albert'], 'salary': [5000, 6000, 7000]} }
指定列去重后的预期输出
ex = {'Alpha': {'id': [10, 15, 20], 'name': ['Jack', 'John'], 'salary': [1000, 2000]}, 'Bravo': {'id': [50, 55, 60], 'name': ['Thomas', 'Robert', 'Albert'], 'salary': [5000, 6000, 7000]} }
解决方案
能否直接用df.to_dict()实现?
不行。df.to_dict()的默认参数(如'list'、'series'等)只能将整个DataFrame转换为单一层级或固定结构的字典,无法直接实现按分组生成嵌套字典的需求,必须结合groupby操作来完成。
1. 保留所有重复值的转换
通过groupby分组后,对每个子DataFrame使用to_dict('list')转换为列名对应列表的字典,最后将分组结果转为外层字典:
# 保留重复值的转换 result = df.groupby('team').apply(lambda x: x.to_dict('list')).to_dict() print(result)
输出结果与保留重复值的预期输出完全一致。
2. 指定列去重的转换
自定义处理函数,对指定列执行去重操作(保持原数据顺序),其他列保留所有值:
def process_group(group, dedup_columns): group_dict = {} for col in group.columns: if col in dedup_columns: # 去重并保持原顺序,转为列表 group_dict[col] = group[col].unique().tolist() else: # 保留所有值转为列表 group_dict[col] = group[col].tolist() return group_dict # 指定需要去重的列 dedup_cols = ['name', 'salary'] # 执行分组转换 result_dedup = df.groupby('team').apply(lambda x: process_group(x, dedup_cols)).to_dict() print(result_dedup)
输出结果与指定列去重后的预期输出完全一致。
内容的提问来源于stack exchange,提问作者EStark
相关产品推荐
相关产品推荐

