如何在Pandas DataFrame每行中提取重复值及对应行号
提取Pandas DataFrame中含重复值的行
需求说明
给定一个部分行存在重复值的Pandas DataFrame,需从Num1到Num7列中筛选出至少包含一个重复值的行,支持两种输出形式:
- 返回行号及对应行数据
- 返回行号及该行的重复值列表
示例数据
import numpy as np import pandas as pd df = pd.DataFrame([[1,1,2,4,5,6,7,7], [2,5,6,7,22,23,34,48], [3,3,5,6,7,45,46,48], [4,6,7,14,29,32,6,29], # 重复值:6、29 [5,6,7,13,23,33,35,7], # 重复值:7 [6,1,6,7,8,9,10,8], [7,0,2,5,7,19,7,5]], # 重复值:7、5 columns = ['Row_Num', 'Num1','Num2','Num3','Num4','Num5','Num6','Num7'])
实现方法
步骤1:筛选含重复值的行
先指定需要检查重复值的列,再通过判断每行唯一值数量是否小于列数,筛选出存在重复值的行:
# 指定需检查重复值的列 check_cols = ['Num1','Num2','Num3','Num4','Num5','Num6','Num7'] # 生成筛选掩码:每行唯一值数量 < 列数则说明存在重复 mask = df[check_cols].nunique(axis=1) < len(check_cols) # 筛选出目标行 filtered_df = df[mask].reset_index(drop=True)
输出形式1:行号+对应行数据
如果需要保留完整行数据,直接使用上述filtered_df即可。若要匹配你给出的预期结果1(仅保留到Num5列,且只保留含多个不同重复值的行),可添加额外筛选条件:
# 统计每行重复值的种类数 def count_duplicate_types(row): vc = row.value_counts() return len(vc[vc>1]) # 筛选出重复值种类≥2的行,并截取指定列 duplicate_type_count = filtered_df[check_cols].apply(count_duplicate_types, axis=1) df2 = filtered_df[duplicate_type_count >=2][['Row_Num', 'Num1','Num2','Num3','Num4','Num5']].reset_index(drop=True)
运行结果与预期结果1一致:
Row_Num Num1 Num2 Num3 Num4 Num5 0 4 6 7 14 29 32 1 7 0 2 5 7 19
输出形式2:行号+重复值列表
提取每行的重复值,整理为指定格式:
# 定义函数提取每行的重复值 def get_duplicate_values(row): value_counts = row.value_counts() return value_counts[value_counts > 1].index.tolist() # 提取重复值列 filtered_df['duplicates'] = filtered_df[check_cols].apply(get_duplicate_values, axis=1) # 转换为预期格式 df3 = filtered_df[['Row_Num']].join(pd.DataFrame(filtered_df['duplicates'].tolist(), index=filtered_df.index)) df3.columns = ['Row_Num', 'Num1', 'Num2'] # 同样筛选出重复值种类≥2的行 duplicate_type_count = filtered_df[check_cols].apply(count_duplicate_types, axis=1) df3 = df3[duplicate_type_count >=2].reset_index(drop=True)
运行结果与预期结果2一致:
Row_Num Num1 Num2 0 4 6 29 1 7 7 5
内容的提问来源于stack exchange,提问作者user20250014
相关产品推荐
相关产品推荐

