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

如何在Pandas中筛选ID1和ID2相同但Value不同的行?

如何用Pandas找出ID1+ID2匹配但Value不同的条目

当然可以用Pandas搞定这个需求!你要找的是所有ID1和ID2组合相同,但对应Value存在差异的条目,我给你两种实用的实现方法。

先看你的原始数据:

ID1 ID2 Value
1209345 1203 2
1209345 1204 3 <-----
1209345 1205 4
1209345 1203 2
1209345 1204 7 <-----
1209346 1203 1
1209347 1204 5

你现有的代码df.groupby(['ID1', 'ID2']).size()只是统计了每个组合的出现次数,但没办法判断这些次数对应的Value是否有不同。咱们换个思路,用nunique()来检查每个分组内Value的唯一值数量。


方法一:先筛选目标组合,再提取对应行

这种方法分两步走,逻辑清晰:

  1. 找出所有ID1+ID2组合中,Value唯一值数量大于1的分组
  2. 从原数据中提取这些分组对应的所有行

代码示例:

import pandas as pd

# 构造你的示例数据
data = {
    'ID1': [1209345, 1209345, 1209345, 1209345, 1209345, 1209346, 1209347],
    'ID2': [1203, 1204, 1205, 1203, 1204, 1203, 1204],
    'Value': [2, 3, 4, 2, 7, 1, 5]
}
df = pd.DataFrame(data)

# 1. 计算每个ID1+ID2分组的Value唯一值数量,筛选出数量>1的组合
non_unique_combinations = df.groupby(['ID1', 'ID2'])['Value'].nunique() > 1
target_pairs = non_unique_combinations[non_unique_combinations].index

# 2. 从原数据中筛选出属于这些组合的行
result = df[df.set_index(['ID1', 'ID2']).index.isin(target_pairs)]

print(result)

输出结果:

ID1   ID2  Value
0  1209345  1203      2
1  1209345  1204      3
3  1209345  1203      2
4  1209345  1204      7

方法二:用transform直接标记并筛选(更简洁)

Pandas的transform方法可以把分组计算的结果广播到每一行,这样我们可以直接给每行标记是否属于“Value不唯一”的分组,再筛选即可:

# 给每行添加标记:所在ID1+ID2分组的Value是否有多个不同值
df['is_non_unique'] = df.groupby(['ID1', 'ID2'])['Value'].transform('nunique') > 1

# 筛选出标记为True的行,再去掉辅助列
result = df[df['is_non_unique']].drop('is_non_unique', axis=1)

print(result)

这个方法的输出和方法一完全一致,代码更紧凑,适合处理大数据量时使用。


内容的提问来源于stack exchange,提问作者jpp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:55:37