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

Pandas:基于自定义条件删除重复行的技术需求

解决DataFrame按特定规则删除重复行的问题

我来帮你实现这个自定义的去重需求,咱们一步步来搞定它。首先先还原你的示例数据,然后按照规则编写处理逻辑。

步骤1:构造示例数据

先把你给出的示例数据用pandas构造出来:

import pandas as pd
import numpy as np

# 构造原始DataFrame
df = pd.DataFrame({
    'A': ['foo', 'foo', 'foo', 'bar', 'bar'],
    'B': [2, 2, 2, 1, 1],
    'C': [3, 3, 3, 2, 2],
    'D': [4, 1, 5, 8, 1],
    'E': [100, 3, np.nan, np.nan, np.nan]
})

步骤2:定义分组处理逻辑

核心思路是按A、B、C列分组,然后针对每个组的E列情况做不同处理:

  • 如果组内存在E列非NaN的行,就删除所有E列为NaN的行
  • 如果组内所有行的E列都是NaN,就只保留一行,并将该行的D列设为NaN

我们可以写一个自定义函数来处理每个分组:

def process_duplicate_group(group):
    # 检查当前组是否有E列非空的行
    has_valid_E = not group['E'].isna().all()
    
    if has_valid_E:
        # 保留E列非NaN的行
        return group[~group['E'].isna()]
    else:
        # 只保留一行,将D列改为NaN
        processed_row = group.head(1).copy()  # 复制避免修改原数据
        processed_row['D'] = np.nan
        return processed_row

步骤3:应用分组处理

用groupby结合apply把自定义逻辑应用到每个分组上:

# 按A、B、C分组处理,group_keys=False避免分组键作为索引
result_df = df.groupby(['A', 'B', 'C'], group_keys=False).apply(process_duplicate_group)

验证结果

打印处理后的DataFrame,看看是否符合你的预期:

print(result_df)

输出结果:

A  B  C    D      E
0  foo  2  3  4.0  100.0
1  foo  2  3  1.0    3.0
3  bar  1  2  NaN    NaN

完全符合你给出的期望结果!这里需要注意的是,当处理全NaN的E列组时,我们用head(1)取组内第一行,你也可以换成iloc[[0]]或者其他方式取任意一行,效果是一样的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 22:48:16