You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas如何获取与指定行值匹配的所有行?代码问题排查

解决DataFrame中匹配指定行所有记录的问题

原代码的问题

  1. 参数误用:df.drop_duplicates(keep=False)返回的是仅出现一次的行,而非你需要的“去重后的所有行”——这也是你示例中[0,0,1]这类重复行没被纳入unique_values的原因。
  2. 变量覆盖:循环中每次给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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 22:07:34