如何用Pythonic方式实现Pandas分组后转records格式字典?
按列分组生成records格式字典的高效解法
给定如下DataFrame:
import pandas as pd df = pd.DataFrame({'a': [1,1,1,2], 'b': ['a', 'a', 'b', 'c'], 'd': [1, 2, 3, 4]})
目标是生成以a列值为键,对应分组转为to_dict('records')格式列表为值的字典:
{1: [{'b':'a', 'd': 1}, {'b': 'a', 'd': 2}, {'b': 'b', 'd': 3}], 2: [{'b': 'c', 'd': 4}]}
尝试过的方法及问题
- 方法1:字典结构正确但格式不符合需求
# 输出结果是列值为列表,而非每个行转成字典的列表 df.groupby('a').agg(list).to_dict('index') # 输出:{1: {'b': ['a', 'a', 'b'], 'd': [1, 2, 3]}, 2: {'b': ['c'], 'd': [4]}}
- 方法2:丢失分组的索引键
# 输出是列表,无法对应原分组的键值 df.groupby('a').agg(list).to_dict('records') # 输出:[{'b': ['a', 'a', 'b'], 'd': [1, 2, 3]}, {'b': ['c'], 'd': [4]}]
- 方法3:因索引不唯一报错
df.set_index('a').to_dict('index') # 报错:ValueError: DataFrame index must be unique for orient='index'
两种Pythonic的解法
解法1:利用groupby.apply
result = df.groupby('a').apply(lambda x: x[['b', 'd']].to_dict('records')).to_dict() print(result)
通过apply对每个分组的DataFrame直接调用to_dict('records'),最后用to_dict()将分组键和结果映射成目标字典。
解法2:字典推导式
result = {key: group[['b', 'd']].to_dict('records') for key, group in df.groupby('a')} print(result)
直接遍历groupby返回的键值对,对每个分组处理后构建字典,可读性强且高效。
内容的提问来源于stack exchange,提问作者Bruno Mello
相关产品推荐
相关产品推荐

