基于固定ID与多条件删除Pandas DataFrame行(优先保留ColB)
基于多条件删除DataFrame行(优先保留ColB)
核心思路
针对每个ID分组判断:如果该ID同时存在ColA和ColB记录,仅保留ColB行;如果仅存在ColA记录,则全部保留。
代码实现
先构造示例DataFrame:
import pandas as pd # 示例输入数据 data = { 'ID': ['A', 'A', 'B', 'C', 'C', 'C'], 'Type': ['ColA', 'ColB', 'ColA', 'ColA', 'ColB', 'ColA'], 'Value': [10, 20, 30, 40, 50, 60] } df = pd.DataFrame(data)
方法1:使用groupby + transform(简洁高效)
# 标记每个ID是否存在ColB记录 df['has_colB'] = df.groupby('ID')['Type'].transform(lambda x: 'ColB' in x.values) # 过滤行:要么无ColB(保留所有),要么有ColB但Type不是ColA result = df[(~df['has_colB']) | (df['Type'] != 'ColA')].drop('has_colB', axis=1)
方法2:使用groupby + apply(逻辑直观)
def filter_id_group(group): # 若组内存在ColB,仅保留ColB行;否则保留全部 if 'ColB' in group['Type'].values: return group[group['Type'] != 'ColA'] return group result = df.groupby('ID').apply(filter_id_group).reset_index(drop=True)
输入输出示例
输入DataFrame:
| ID | Type | Value |
|---|---|---|
| A | ColA | 10 |
| A | ColB | 20 |
| B | ColA | 30 |
| C | ColA | 40 |
| C | ColB | 50 |
| C | ColA | 60 |
输出结果:
| ID | Type | Value |
|---|---|---|
| A | ColB | 20 |
| B | ColA | 30 |
| C | ColB | 50 |
内容的提问来源于stack exchange,提问作者user3904096
相关产品推荐
相关产品推荐

