pandas - 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
有没有更好的方法来解决这个问题?我不是熊猫专家。
解决方案
你的解决方案很好!尽管您可以通过摆脱该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
推荐阅读
- python - 如何将一组列与另一组列连接,以使结果列包含 n*m 列的数组
- homebrew - 自制软件从 SSO 后面的私有 github 下载包
- python - 使用正则表达式的 Python 的 Mad Libs ATBS
- python - 如何从使用“通过”创建的 M2M 过渡到由 Django 管理的 M2M
- jenkins - 我无法使用 jenkins 配置设置将 artifactory 集成到 jenkins
- python - 在 cmd windows 中从 php 运行 python 脚本
- kotlin - 如何在 Compose 中保留列控件的展开项?
- python - Python bs4突然'TypeError:'NoneType'对象不可迭代'
- python - 如何在 django 中获取引用模型的字段的值?
- java - 理解 Java 中的引用;BST 的 addNode() 函数未按应有的方式运行