Pandas 0.16.2版本groupby聚合agg(list)不生效的解决方法
Pandas 0.16.2版本分组聚合为列表的实现方案
问题场景
工作环境Python依赖版本受限,必须使用Pandas 0.16.2版本。高版本Pandas支持的df.groupby(category).agg(list)写法在该版本无法运行,需要实现分组后将同组各列取值聚合为列表的效果。
待处理的原始DataFrame结构:
Type Cost 0 Food - Type A 1.50 1 Food - Type B 2.20 2 Car - Type A 1.30 3 Car - Type B 2.40 4 Car - Type C 3.70
预处理生成分组键的代码:
category = df['Type'].str.split(' -', expand=True)[0]
分组键输出结果:
0 Food 1 Food 2 Car 3 Car 4 Car
目标聚合效果:
Type Cost Food [Food - Type A, Food - Type B] [1.5, 2.2] Car [Car - Type A, Car - Type B, Car - Type C] [1.3, 2.4, 3.7]
兼容旧版本的实现方法
Pandas 0.16.2的agg方法未适配直接传入内置list对象的逻辑,可通过以下两种方式实现同等效果:
方案1:逐列应用列表聚合后拼接(稳定性最高)
先创建分组对象,对每一列单独调用apply(list)完成聚合,最后沿列方向拼接所有列的聚合结果,代码如下:import pandas as pd group_obj = df.groupby(category) result = pd.concat([group_obj[col].apply(list) for col in df.columns], axis=1)该写法完全适配0.16.2版本的API规则,不会触发类型校验问题,运行结果和高版本
agg(list)完全一致。方案2:用lambda表达式包装列表转换逻辑
如果希望保持单句agg的写法,可以传入lambda表达式显式将分组序列转为列表:result = df.groupby(category).agg(lambda x: list(x))提示:该写法在DataFrame存在混合类型列时可能触发旧版本的类型校验报错,生产环境优先使用方案1。
内容的提问来源于stack exchange,提问作者LearnerCode
相关产品推荐
相关产品推荐

