Python Polars分组聚合拼接列值报错,求非lambda/map_groups优化方案
解决Polars聚合拼接列值的报错问题
错误原因
你用Python原生的';'.join()方法处理Polars表达式对象是行不通的——str.join()只能接收可迭代的Python对象(比如列表),但pl.col(...)返回的是Polars的表达式节点(抽象语法树的一部分),并非实际可迭代数据,因此抛出can only join an iterable的类型错误。
正确解法
改用Polars内置的表达式方法实现聚合拼接,完全利用矢量化计算,性能远优于map_groups或lambda函数。修改你的聚合函数如下:
def agg_ll_field(col_name) -> pl.Expr: # 对组内列值去空、去重、排序后,用分号拼接成字符串 return pl.col(col_name).drop_nulls().unique().sort().str.concat(delimiter=';') dfa = df.lazy()\ .group_by('SharedSourceSystem', 'FOPortfolioName')\ .agg( agg_ll_field('BookingUnits').alias('BOOKG_UNIT') )\ .collect()
如果你的Polars版本较旧(<0.18.0),可以用list.to_string()替代str.concat():
def agg_ll_field(col_name) -> pl.Expr: return pl.col(col_name).drop_nulls().unique().sort().list.to_string(delimiter=';')
为什么这样做
这种写法完全基于Polars的矢量化执行引擎,避免了Python层面的循环或串行处理,性能和map_groups不在一个量级,同时满足你不用lambda函数的需求。
内容的提问来源于stack exchange,提问作者Greg Vaysman
相关产品推荐
相关产品推荐

