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

如何在Pandas中删除ID重复行,保留TYPE为F的行并获取删除行索引

数据处理:按ID去重并保留指定条件行,同时获取删除索引

原始数据

IDCARTYPE
10Audi1F
20BMW1nan
50BMW2nan
10Audi2nan
30MazdaF
10Audi3F
20BMW3Z
20BMW4F
20BMW5A
40KIAG
10Audi4A
10Audi5G
10Audi6nan

需求说明

删除ID列的重复行,规则为:

  • 若某ID存在TYPE=F的行,仅保留其中一条TYPE=F的行;
  • 若某ID无TYPE=F的行,则保留该行(每组ID仅留一行);
  • 同时获取所有被删除行的原始索引。

期望结果

IDCARTYPE
10Audi1F
20BMW4F
30MazdaF
40KIAG
50BMW2nan

解决方案(使用Pandas)

import pandas as pd
import numpy as np

# 构造原始DataFrame(实际场景可替换为读取文件逻辑)
data = {
    'ID': [10,20,50,10,30,10,20,20,20,40,10,10,10],
    'CAR': ['Audi1','BMW1','BMW2','Audi2','Mazda','Audi3','BMW3','BMW4','BMW5','KIA','Audi4','Audi5','Audi6'],
    'TYPE': ['F',np.nan,np.nan,np.nan,'F','F','Z','F','A','G','A','G',np.nan]
}
df = pd.DataFrame(data)

# 标记每个ID是否存在TYPE=F的记录
id_has_f = df.groupby('ID')['TYPE'].apply(lambda x: (x == 'F').any())

# 构造筛选掩码:保留TYPE=F的行,或无F的ID的第一条记录
mask = (df['TYPE'] == 'F') | (~df['ID'].map(id_has_f) & (df.groupby('ID').cumcount() == 0))
df_keep = df[mask].reset_index(drop=True)

# 获取被删除行的原始索引
deleted_indices = df.index[~mask].tolist()

# 输出结果
print("处理后数据:")
print(df_keep)
print("\n被删除行的索引:")
print(deleted_indices)

代码说明

  1. 标记ID是否含F:通过groupby分组后判断每个ID下是否存在TYPE=F的记录;
  2. 筛选保留行:使用掩码mask同时满足两个规则,确保每个ID仅保留符合要求的一行;
  3. 获取删除索引:通过原始索引与保留索引的差集,得到被删除行的索引列表。

输出结果

运行代码后,会得到:

处理后数据:
   ID    CAR TYPE
0  10  Audi1    F
1  20  BMW4     F
2  30  Mazda    F
3  40    KIA    G
4  50   BMW2  NaN

被删除行的索引:
[1, 3, 5, 6, 8, 10, 11, 12]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 14:20:35