Polars分组聚合拼接唯一值时报错,求正确实现方法
Polars分组聚合拼接唯一值报错解决方案
错误原因
Polars的group_by().agg()与Pandas的agg逻辑不同:Polars要求传入Polars表达式(而非直接处理列数据的Python函数/lambda),你之前的代码直接将自定义函数调用作为lambda传入,Polars无法识别这种函数类型的参数,因此抛出TypeError。
正确实现方式
方法一:用Polars内置函数实现(推荐,性能更优)
利用Polars的向量化内置函数,先取每组唯一值,再拼接成字符串:
import polars as pl # 构造DataFrame dd = pl.DataFrame({ 'col1': [1,1,2,3,4], 'col2': ['a','a','a','b','b'], 'col3': ['qwe','rty','asd','fgh','zxc'] }) # 分组聚合:取唯一值后拼接 result = dd.group_by('col1').agg( pl.col('*').unique().str.concat('|') ) print(result)
输出结果:
shape: (5, 3) ┌──────┬──────┬─────────┐ │ col1 ┆ col2 ┆ col3 │ │ --- ┆ --- ┆ --- │ │ i64 ┆ str ┆ str │ ╞══════╪══════╪═════════╡ │ 1 ┆ a ┆ qwe|rty │ │ 2 ┆ a ┆ asd │ │ 3 ┆ b ┆ fgh │ │ 4 ┆ b ┆ zxc │ └──────┴──────┴─────────┘
方法二:使用自定义函数(适合复杂逻辑场景)
如果必须用自定义函数处理,需通过map_groups接收分组后的DataFrame进行操作:
import polars as pl def process_group(group_df): # 对分组内的每列,取唯一值后拼接 return group_df.select( pl.col('col2', 'col3').apply(lambda x: '|'.join(set(x)), return_dtype=pl.Utf8) ) dd = pl.DataFrame({ 'col1': [1,1,2,3,4], 'col2': ['a','a','a','b','b'], 'col3': ['qwe','rty','asd','fgh','zxc'] }) result = dd.group_by('col1').map_groups(process_group) print(result)
内容的提问来源于stack exchange,提问作者frank
相关产品推荐
相关产品推荐

