如何在Pandas中删除ID重复行,保留TYPE为F的行并获取删除行索引
数据处理:按ID去重并保留指定条件行,同时获取删除索引
原始数据
| ID | CAR | TYPE |
|---|---|---|
| 10 | Audi1 | F |
| 20 | BMW1 | nan |
| 50 | BMW2 | nan |
| 10 | Audi2 | nan |
| 30 | Mazda | F |
| 10 | Audi3 | F |
| 20 | BMW3 | Z |
| 20 | BMW4 | F |
| 20 | BMW5 | A |
| 40 | KIA | G |
| 10 | Audi4 | A |
| 10 | Audi5 | G |
| 10 | Audi6 | nan |
需求说明
删除ID列的重复行,规则为:
- 若某ID存在
TYPE=F的行,仅保留其中一条TYPE=F的行; - 若某ID无
TYPE=F的行,则保留该行(每组ID仅留一行); - 同时获取所有被删除行的原始索引。
期望结果
| ID | CAR | TYPE |
|---|---|---|
| 10 | Audi1 | F |
| 20 | BMW4 | F |
| 30 | Mazda | F |
| 40 | KIA | G |
| 50 | BMW2 | nan |
解决方案(使用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)
代码说明
- 标记ID是否含F:通过
groupby分组后判断每个ID下是否存在TYPE=F的记录; - 筛选保留行:使用掩码
mask同时满足两个规则,确保每个ID仅保留符合要求的一行; - 获取删除索引:通过原始索引与保留索引的差集,得到被删除行的索引列表。
输出结果
运行代码后,会得到:
处理后数据: 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
相关产品推荐
相关产品推荐

