Pandas如何获取与指定行值匹配的所有行?代码问题排查
解决DataFrame中匹配指定行所有记录的问题
原代码的问题
- 参数误用:
df.drop_duplicates(keep=False)返回的是仅出现一次的行,而非你需要的“去重后的所有行”——这也是你示例中[0,0,1]这类重复行没被纳入unique_values的原因。 - 变量覆盖:循环中每次给
df_subset赋值都会覆盖之前的结果,最终仅保留最后一次循环的匹配行。
修正方案
方案1:循环匹配并收集结果
先获取所有去重后的行,再逐个匹配原DataFrame中的对应记录并存储:
import pandas as pd # 示例DataFrame df = pd.DataFrame([[0,0,1],[2,2,0],[0,0,1],[0,0,1],[0,0,1]], columns=["col1", "col2", "col3"]) # 获取所有去重后的行(保留首次出现的行) unique_rows = df.drop_duplicates(keep="first") # 用字典存储每个去重行对应的所有匹配记录 row_matches = {} for _, row in unique_rows.iterrows(): # 生成掩码:筛选与当前行完全一致的所有记录 match_mask = (df == row).all(axis=1) row_matches[tuple(row.values)] = df[match_mask] # 获取目标行[0,0,1]的所有匹配记录 target_row_tuple = (0, 0, 1) print(row_matches[target_row_tuple])
方案2:用merge高效关联
避免循环,通过合并操作直接获取所有匹配行:
import pandas as pd df = pd.DataFrame([[0,0,1],[2,2,0],[0,0,1],[0,0,1],[0,0,1]], columns=["col1", "col2", "col3"]) # 获取去重后的行,添加临时标记列 unique_rows = df.drop_duplicates(keep="first").assign(temp=1) # 合并原DataFrame,得到所有匹配的行 all_matches = df.merge(unique_rows, on=df.columns.tolist(), how="left") # 按行值分组,直接获取目标行的所有实例 grouped = all_matches.groupby(["col1", "col2", "col3"]) target_group = grouped.get_group((0, 0, 1)) print(target_group)
特殊需求:仅获取重复出现的行的全部实例
如果你的目标是排除仅出现一次的行,只保留有重复的行的所有实例,可以直接用duplicated:
# 标记所有重复行(包括首次出现的) duplicate_mask = df.duplicated(keep=False) # 获取所有重复行的实例 duplicate_rows = df[duplicate_mask] print(duplicate_rows)
示例输出
运行上述代码后,目标行[0,0,1]对应的输出会包含索引0、2、3、4的行,符合预期。
内容的提问来源于stack exchange,提问作者Gooby
相关产品推荐
相关产品推荐

