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

如何在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示例

需求说明

需要在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 02:57:48