如何在Python Pandas中基于两列组合值删除DataFrame重复项?
问题:在Pandas中保留每个id对应唯一survey值的一组行
我有如下Pandas DataFrame:
import pandas as pd import numpy as np df = pd.DataFrame({ 'id' : [999, 999, 999, 185, 185, 185, 999, 999, 999], 'target' : [1, 1, 1, 0, 0, 0, 1, 1, 1], 'event': ['2023-01-01', '2023-01-02', '2023-02-03', '2023-01-01', '2023-01-02', '2023-01-03', '2023-01-01', '2023-01-02', '2023-01-03'], 'survey': ['2023-02-02', '2023-02-02', '2023-02-02', '2023-03-10', '2023-03-10', '2023-03-10', '2023-04-22', '2023-04-22', '2023-04-22'], 'event1': [1, 6, 11, 16, np.nan, 22, 74, 109, 52], 'event2': [2, 7, np.nan, 17, 22, np.nan, np.nan, 10, 5], 'event3': [3, 8, 13, 18, 23, np.nan, 2, np.nan, 99], 'event4': [4, 9, np.nan, np.nan, np.nan, 11, 8, np.nan, np.nan], 'event5': [5, np.nan, 15, 20, 25, 1, 1, 3, np.nan] }) df = df.fillna(0) df

需求说明
需要在DataFrame中保留每个id对应的唯一survey值的所有行。例如,id=999对应survey值2023-02-02和2023-04-22,只需保留其中一组的全部行即可。
期望结果
最终需要得到如下DataFrame:
df = pd.DataFrame({ 'id' : [999, 999, 999, 185, 185, 185], 'target' : [1, 1, 1, 0, 0, 0], 'event': ['2023-01-01', '2023-01-02', '2023-02-03', '2023-01-01', '2023-01-02', '2023-01-03'], 'survey': ['2023-02-02', '2023-02-02', '2023-02-02', '2023-03-10', '2023-03-10', '2023-03-10'], 'event1': [1, 6, 11, 16, np.nan, 22], 'event2': [2, 7, np.nan, 17, 22, np.nan], 'event3': [3, 8, 13, 18, 23, np.nan], 'event4': [4, 9, np.nan, np.nan, np.nan, 11], 'event5': [5, np.nan, 15, 20, 25, 1] }) df = df.fillna(0) df

解决方案
以下三种方法均可实现需求,其中方法三性能最优,适合大型数据集:
- 方法一:使用
groupby+apply筛选第一个survey组
# 按id分组,取每个id下第一个出现的survey对应的所有行 result = df.groupby('id').apply(lambda x: x[x['survey'] == x['survey'].iloc[0]]).reset_index(drop=True)
- 方法二:通过
drop_duplicates获取唯一匹配对后合并
# 提取每个id对应的一个survey值(默认保留第一个出现的) unique_pairs = df[['id', 'survey']].drop_duplicates('id') # 匹配原DataFrame,保留符合条件的行 result = df.merge(unique_pairs, on=['id', 'survey'])
- 方法三:使用
transform生成掩码筛选
# 为每个id组生成掩码:仅保留survey等于组内第一个值的行 keep_mask = df.groupby('id')['survey'].transform(lambda x: x == x.iloc[0]) result = df[keep_mask]
内容的提问来源于stack exchange,提问作者dingaro
相关产品推荐
相关产品推荐

