如何在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
相关产品推荐
相关产品推荐

