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

如何在Pandas分组(groupby)后对多列进行条件校验?

Pandas分组多条件校验问题解决

原始DataFrame

首先是待处理的DataFrame(已修正原始数据的语法错误):

import pandas as pd

data = [
    ['a', 'one', 10],
    ['a', 'two', 10],
    ['b', 'one', 13],
    ['b', 'two', 100],
    ['c', 'two', 100],
    ['c', 'one', 100],
    ['d', 'one', 100],
    ['d', 'one', 10]
]
df = pd.DataFrame(data, columns=['key1', 'key2', 'key3'])

对应的表格数据:

key1    key2    key3
0   a   one 10
1   a   two 10
2   b   one 13
3   b   two 100
4   c   two 100
5   c   one 100
6   d   one 100
7   d   one 10

校验需求

按key1分组后,需同时满足两个条件,满足则结果为ok,否则为nok:

  • 分组内key2 == 'one'的出现次数恰好为1次(次数为0或大于1则结果为NOK);
  • 分组内所有key3的值必须为10或100(否则结果为NOK)。

期望输出

key1  result
a     ok
b     nok
c     ok
d     nok

现有代码问题

现有代码仅实现了key2的校验逻辑,未加入key3的校验,导致输出不符合预期:

test = df.groupby('key1')['key2'].apply(lambda x:(x=='one').sum()).reset_index(name='result')
test['result'].where(~(test['result'] > 1), other='nok', inplace=True)
test['result'].replace([0, 1], ['nok', 'ok'], inplace = True)

解决方案

通过groupby.apply()对每个分组进行整体判断,同时校验两个条件,代码更简洁清晰:

result = df.groupby('key1').apply(
    lambda group: 'ok' if ((group['key2'] == 'one').sum() == 1) and (group['key3'].isin([10, 100]).all()) else 'nok'
).reset_index(name='result')

# 打印结果
print(result)

代码说明

  • (group['key2'] == 'one').sum() == 1:统计分组内key2为'one'的次数,确保恰好为1次;
  • group['key3'].isin([10, 100]).all():检查分组内所有key3的值是否都在[10,100]范围内;
  • 两个条件通过and连接,同时满足则返回ok,否则返回nok。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 02:32:22