You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Polars中pandas groupby.apply(drop_duplicates)的等效实现方法

Polars中实现pandas groupby.apply(drop_duplicates)的等效方法

需求背景

作为Polars新手,需要找到与pandas中groupby.apply(drop_duplicates)等效的实现方式。对应的pandas示例代码如下:

import pandas as pd

GROUP = list('123231232121212321')
OPERATION = list('AAABBABAAAABBABBBA')
BATCH = list('777898897889878987')

df_input = pd.DataFrame({'GROUP':GROUP, 'OPERATION':OPERATION, 'BATCH':BATCH})
df_output = df_input.groupby('GROUP').apply(lambda x: x.drop_duplicates())

错误尝试

尝试了以下Polars代码,但未得到预期输出:

import polars as pl

GROUP = list('123231232121212321')
OPERATION = list('AAABBABAAAABBABBBA')
BATCH = list('777898897889878987')

df_input = pl.DataFrame({'GROUP':GROUP, 'OPERATION':OPERATION, 'BATCH':BATCH})
df_output = df_input.group_by('GROUP').agg(pl.all().unique())

单独提取分组处理时能得到正确结果:

df_part = df_input.filter(pl.col('GROUP')=='2')
df_part[['OPERATION', 'BATCH']].unique()

正确实现方法

方法一:使用group_by().apply

直接在分组后调用apply,对每个分组DataFrame执行unique(),逻辑与pandas完全对应:

import polars as pl

GROUP = list('123231232121212321')
OPERATION = list('AAABBABAAAABBABBBA')
BATCH = list('777898897889878987')

df_input = pl.DataFrame({'GROUP':GROUP, 'OPERATION':OPERATION, 'BATCH':BATCH})
df_output = df_input.group_by('GROUP').apply(lambda group_df: group_df.unique())

方法二:直接全局去重(更高效)

groupby.apply(drop_duplicates)本质是按分组列+其他所有列的组合去重,因此可以直接调用全局unique()方法并指定所有相关列作为去重依据,这种方式性能更优:

df_output = df_input.unique(subset=['GROUP', 'OPERATION', 'BATCH'], keep='first')

错误原因说明

之前使用group_by('GROUP').agg(pl.all().unique())的问题在于:agg会将每个分组内的每一列单独提取唯一值并打包成列表,最终得到的是每个GROUP对应一行,每行的OPERATION和BATCH是数组类型,而非展开的唯一行结构,与pandas的输出格式不符。

内容的提问来源于stack exchange,提问作者Upsikan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 08:18:33