首页 > 解决方案 > Pandas - 查找两个或更多满足条件的行

问题描述

对于此示例,我有在不同站点位置进行测试的记录。

df = pd.DataFrame({'test_id': [1,2,3,4,5,6,7,8, 9],
                   'name':['site1', 'site2', 'site3', 'site4', 'site1', 'site2', 'site3', 'site4', 'site5'],
                   'value':['elevated', 'ok', 'high', 'ok', 'elevated', 'elevated','elevated', 'elevated', 'ok']})


   test_id   name     value
0        1  site1  elevated
1        2  site4        ok
2        3  site2      high
3        4  site3        ok
4        5  site2  elevated
5        6  site1  elevated
6        7  site3        ok
7        8  site4  elevated
8        9  site5        ok


我需要标记站点有 2 个或更多失败(非正常)测试的行。

我将其视为需要分组和计数,并提出以下建议:

df['flag'] = df.isin(df.loc[df['value'] != 'ok'].groupby(['name']).filter(lambda x: len(x) > 1))['value']

   test_id   name     value   flag
0        1  site1  elevated   True
1        2  site2        ok  False
2        3  site3      high   True
3        4  site4        ok  False
4        5  site1  elevated   True
5        6  site2  elevated  False
6        7  site3  elevated   True
7        8  site4  elevated  False
8        9  site5        ok  False

有没有更好的方法来解决这个问题?我不是熊猫专家。

标签: pandaspandas-groupby

解决方案


你的解决方案很好!尽管您可以通过摆脱该lambda功能并仅使用本机矢量化方法来加快速度。

所以我们首先得到一个布尔数组,其中所有行都不等于ok。然后我们 groupbyname并得到sum每个组的transform. sum > 1最后我们检查哪些行有一个Series.gt代表greater than例如>

df['flag'] = df['value'].ne('ok').groupby(df['name']).transform('sum').gt(1)

   test_id   name     value   flag
0        1  site1  elevated   True
1        2  site2        ok  False
2        3  site3      high   True
3        4  site4        ok  False
4        5  site1  elevated   True
5        6  site2  elevated  False
6        7  site3  elevated   True
7        8  site4  elevated  False
8        9  site5        ok  False

推荐阅读