基于重复列值筛选Pandas DataFrame(Python)
解决方案
你可以通过Pandas的分组(groupby)功能筛选符合条件的列,核心思路是检查每个Name分组内的所有行在该列上的值是否完全一致,以下是两种实用实现方法:
方法一:利用nunique()检查唯一值数量
每个Name分组恰好有两行,若某列在分组内的唯一值数量为1,说明两行值完全相同。只需筛选出所有分组都满足该条件的列:
import pandas as pd # 构造示例DataFrame data = { 'Name': ['Alex', 'Alex', 'Sam', 'Sam', 'John', 'John'], '1': [10, 10, 30, 30, 50, 50], '2': [40, 60, 15, 12, 18, 15], '3': [20, 20, 50, 50, 100, 100], '4': [11, 11, 15, 15, 8, 8], '5': [50, 60, 60, 43, 32, 21] } df = pd.DataFrame(data) # 按Name分组,计算每个列在分组内的唯一值数量 group_unique_counts = df.groupby('Name').nunique() # 筛选出所有分组唯一值数量都是1的列 consistent_cols = group_unique_counts.columns[group_unique_counts.eq(1).all()].tolist() # 保留Name列和符合条件的列 result = df[['Name'] + consistent_cols] print(result)
输出结果:
Name 1 3 4 0 Alex 10 20 11 1 Alex 10 20 11 2 Sam 30 50 15 3 Sam 30 50 15 4 John 50 100 8 5 John 50 100 8
方法二:利用transform()检查组内值一致性
通过transform对每个分组内的列值进行检查,判断所有值是否与组内第一个值相同,再筛选出全部分组都满足条件的列:
# 检查每个分组内的列值是否全部等于组内第一个值 is_consistent = df.groupby('Name').transform(lambda x: x.eq(x.iloc[0]).all()) # 筛选出所有行都为True的列(即每个分组都满足一致性) consistent_cols = is_consistent.columns[is_consistent.all()].tolist() # 生成结果 result = df[['Name'] + consistent_cols]
两种方法最终效果一致,都能保留Name、1、3、4这几列。
内容的提问来源于stack exchange,提问作者mariant
相关产品推荐
相关产品推荐

