按多值筛选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'] })
对应的表格数据:
| date | id | value | categorie |
|---|---|---|---|
| 20220101 | 1 | 11 | a |
| 20220102 | 1 | 22 | a |
| 20220103 | 1 | 33 | c |
| 20220101 | 2 | 44 | a |
| 20220102 | 2 | 55 | c |
| 20220101 | 3 | 66 | c |
目前用这段代码按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
相关产品推荐
相关产品推荐

