如何通过apply/lambda将分组后的DataFrame转换为指定格式字典?
问题与解决方案
你现在的需求是把按列A分组的DataFrame转换成键为A的取值,值为(B,C)元组组成的列表的字典对吧?先梳理下你的原始数据、目标格式和遇到的问题:
原始DataFrame结构
A B C 0 11 one 5 1 11 two 7 2 11 three 9 3 22 one 11 4 22 two 13
目标字典格式
{11: [('one', 5), ('two', 7), ('three', 9)], 22: [('one', 11), ('two', 13)]}
你之前尝试的代码:
df_dict = df.groupby('A').apply(lambda y: {(x.B, x.C) for i, x in y.iterrows()})
得到的是分组后的Series,且值是集合(大括号包裹),和目标的字典+列表结构不符。
修改后的代码方案
这里有两种实用的修改方式:
方法一:调整返回类型并转字典
把lambda里的集合改为列表,最后用to_dict()把分组结果转为字典:
df_dict = df.groupby('A').apply(lambda y: [(x.B, x.C) for i, x in y.iterrows()]).to_dict()
方法二:更高效的实现(避免iterrows())
iterrows()在数据量大时效率偏低,我们可以直接对分组后的列用zip生成元组列表:
df_dict = df.groupby('A').apply(lambda g: list(zip(g['B'], g['C']))).to_dict()
问题原因说明
- 你用
{(x.B, x.C) ...}生成的是集合,而目标需要的是有序的列表,所以要把大括号{}改成方括号[]; groupby.apply()默认返回Series对象,而非字典,因此需要调用to_dict()完成格式转换。
这样修改后就能得到你期望的字典结构啦!
内容的提问来源于stack exchange,提问作者ZHICHEN GUO
相关产品推荐
相关产品推荐

