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
相关产品推荐
相关产品推荐

