如何筛选Pandas DataFrame中同一行任意两列值相等的行?
筛选DataFrame中存在任意列值相等的行
需求说明
需要筛选Pandas DataFrame中同一行内任意两不同列值相等的行,需覆盖所有两两列组合:
- col1与col2、col3、col4
- col2与col3、col4
- col3与col4
当前仅能实现col2与col3的相等判断,需扩展逻辑。
解决方案(无需迭代,用Pandas向量化操作)
方案1:利用nunique()批量判断行内重复值
该方法通过计算每行的唯一值数量来判断是否存在重复:若唯一值数量小于列数,说明该行至少有一对不同列值相等。优点是扩展性强,列数变化时无需修改代码。
完整代码
# -*- coding: utf-8 -*- import pandas as pd # 构建原始DataFrame rows = { 'col1':['5412','5148','5800','2122','5645','1060','4801','1039'], 'col2':['542','512','541','412','565','562','645','152'], 'col3':['542','3120','3410','2112','5650','5620','4801','152'], 'col4':['5800','2122','5645','2112','412','562','562','645'] } df = pd.DataFrame(rows) print(f'原始DataFrame \n\n{df}') # 筛选存在任意列值相等的行 filtered_df = df[df.nunique(axis=1) < df.shape[1]] print('\n\n符合条件的行:') print(filtered_df) # 移除符合条件的行(保留所有列值唯一的行) dropped_df = df[df.nunique(axis=1) == df.shape[1]] print('\n\n移除符合条件后的行:') print(dropped_df)
输出结果
符合条件的行:
col1 col2 col3 col4 0 5412 542 542 5800 3 2122 412 2112 2112 5 1060 562 5620 562 6 4801 645 4801 562 7 1039 152 152 645
方案2:手动枚举所有两两列比较
若需明确指定检查的列组合,可手动生成所有两两列的相等条件,再通过逻辑或(|)组合判断。
核心代码片段
# 生成所有两两列的相等条件 condition = ( (df['col1'] == df['col2']) | (df['col1'] == df['col3']) | (df['col1'] == df['col4']) | (df['col2'] == df['col3']) | (df['col2'] == df['col4']) | (df['col3'] == df['col4']) ) # 筛选符合条件的行 filtered_df = df[condition] print('\n\n符合条件的行:') print(filtered_df)
该方案逻辑直观,适合列数较少的场景。
内容的提问来源于stack exchange,提问作者Tommy Gibbons
相关产品推荐
相关产品推荐

