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
相关产品推荐
相关产品推荐

