You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 14:30:52