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

按多值筛选DataFrame列,仅保留categorie为'a'的每组最后一行

问题描述

现有如下Pandas DataFrame:

import pandas as pd
df = pd.DataFrame({
    'date':[20220101,20220102,20220103,20220101,20220102,20220101], 
    'id':[1,1,1,2,2,3], 
    'value':[11,22,33,44,55,66], 
    'categorie':['a','a','c','a','c','c']
})

对应的表格数据:

dateidvaluecategorie
20220101111a
20220102122a
20220103133c
20220101244a
20220102255c
20220101366c

目前用这段代码按categorie列的多值筛选:

df = df[df['categorie'].isin(['a','c'])]

现在需要补充规则:categorie为'a'的行,只留每个id组的最后一行;categorie为'c'的行全部保留,想找更Pythonic的实现方式。

解决方案

方法一:拆分处理再合并(逻辑直白)

把数据拆成a和c两部分分别处理,最后合并,可读性拉满:

# 处理a类:按id分组取每组最后一行
df_a = df[df['categorie'] == 'a'].groupby('id').tail(1)
# 直接保留所有c类行
df_c = df[df['categorie'] == 'c']
# 合并结果,还原原索引顺序
result = pd.concat([df_a, df_c]).sort_index()

方法二:分组自定义处理(更简洁)

利用groupby结合apply,在分组里根据类别执行不同逻辑,一行搞定核心处理:

result = df[df['categorie'].isin(['a','c'])].groupby(
    ['id', 'categorie'], group_keys=False
).apply(lambda x: x.tail(1) if x.name[1] == 'a' else x)

最终输出结果:

date  id  value categorie
1  20220102   1     22         a
2  20220103   1     33         c
3  20220101   2     44         a
4  20220102   2     55         c
5  20220101   3     66         c

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 21:05:48