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

Pandas如何筛选col0、col1分组下col2同时包含-1和1的所有行

解决方案

核心逻辑

按col0、col1分组后,仅保留同时包含col2=-1和col2=1的分组下所有行,其余分组整组删除。

完整实现代码

import pandas as pd

# 构造示例DataFrame,val列直接做除法运算得到对应数值
df = pd.DataFrame([
    ['a1', 'b1', -1, 0/1],
    ['a1', 'b1',  1, 1/1],
    ['a1', 'b2', -1, 2/1],
    ['a1', 'b2',  1, 1/2],
    ['a2', 'b1',  1, 1/3],
    ['a2', 'b2', -1, 2/3],
    ['a2', 'b2',  1, 4/1]
], columns=['col0', 'col1', 'col2', 'val'])

# 核心筛选逻辑:用groupby.filter直接保留符合条件的分组
result = df.groupby(['col0', 'col1']).filter(lambda group: {-1, 1}.issubset(group['col2'].unique()))

print(result)

输出结果

col0 col1  col2       val
0   a1   b1    -1  0.000000
1   a1   b1     1  1.000000
2   a1   b2    -1  2.000000
3   a1   b2     1  0.500000
5   a2   b2    -1  0.666667
6   a2   b2     1  4.000000

替代方案(避免多级索引问题)

如果不想处理分组带来的多级索引,可以用分组标记+布尔索引的方式实现:

# 给每个分组标记是否同时包含-1和1
df['keep_flag'] = df.groupby(['col0', 'col1'])['col2'].transform(lambda x: {-1,1}.issubset(x.unique()))
# 筛选标记为True的行,删除辅助列即可得到最终结果
result = df[df['keep_flag']].drop('keep_flag', axis=1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 11:45:04