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

如何在按两列分组的DataFrame中判断某列值是否不在同组另一列

实现方案

问题原因

你原代码存在两个核心问题:

  • 逻辑层面:~x.z.isin(x.s)是针对全表做判断,没有限定在当前分组的s列范围内,不符合需求
  • 语法层面:groupby对象后直接拼接索引选取的写法不符合pandas规范,是导致运行卡顿、无结果的直接原因

可行实现代码

写法1:groupby + apply(逻辑直观,适合中小数据量)

import pandas as pd

# 示例数据
x = pd.DataFrame({
    'x': [1,1,1,1,1,1,2], 
    'y': [4,4,4,5,5,5,4], 
    'z':['a', 'b', 'c', 'a', 'b', 'c', 'a'], 
    's':['a', 'a', 'b', 'a', 'a', 'a', 'b']
})

# 核心逻辑:按x、y分组后,每个分组内筛选z不在当前分组s列的行
result = x.groupby(['x', 'y'], group_keys=False).apply(
    lambda group: group[~group['z'].isin(group['s'])]
)

运行后result输出结果如下:

索引xyzs
214cb
624ab

完全符合你的需求,其中x=1、y=4分组下符合条件的就是索引为2的行。


写法2:预聚合合并(性能更高,适合百万级以上大数据量)

如果数据量很大,apply遍历分组的性能不足,可以用预聚合+合并的方式优化:

# 先聚合每个分组的s列唯一值
group_s = x.groupby(['x', 'y'])['s'].agg(set).reset_index(name='s_set')
# 合并回原表
x = x.merge(group_s, on=['x', 'y'], how='left')
# 筛选符合条件的行,删除临时列
result = x[~x.apply(lambda row: row['z'] in row['s_set'], axis=1)].drop(columns='s_set')

运行结果和写法1完全一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 03:36:04