如何用Python Pandas生成资产整体Pass/Fail性能列?
问题:基于Pandas生成资产的整体性能列
我有两列数据:A列是可重复的资产编号,B列是单个实例的pass/fail结果。需要使用Pandas创建overall performance列,规则为:
- 若某资产存在任意一次
fail,则该资产所有行的整体性能均为fail - 若资产所有实例均为
pass,则整体性能为pass
输入数据
| Asset | performance |
|---|---|
| 1 | pass |
| 1 | fail |
| 2 | pass |
| 3 | fail |
| 3 | fail |
| 4 | pass |
期望输出
| Asset | performance | overall performance |
|---|---|---|
| 1 | pass | fail |
| 1 | fail | fail |
| 2 | pass | pass |
| 3 | fail | fail |
| 3 | fail | fail |
| 4 | pass | pass |
是否可以通过Python实现该需求,为每个资产的所有行生成对应的整体性能结果?
解决方案
完全可以实现,这里提供两种简洁的Pandas实现方式:
方法1:分组后映射(直观易懂)
import pandas as pd # 构造输入数据(实际使用时可替换为读取你的数据源) data = { 'Asset': [1, 1, 2, 3, 3, 4], 'performance': ['pass', 'fail', 'pass', 'fail', 'fail', 'pass'] } df = pd.DataFrame(data) # 按资产分组,计算每个资产的整体性能 asset_overall = df.groupby('Asset')['performance'].apply(lambda x: 'fail' if (x == 'fail').any() else 'pass') # 将整体性能匹配到原表的每一行 df['overall performance'] = df['Asset'].map(asset_overall) # 输出结果 print(df)
方法2:使用transform一步完成(更高效)
transform方法可以直接返回与原表行数一致的分组计算结果,无需额外映射步骤:
import pandas as pd data = { 'Asset': [1, 1, 2, 3, 3, 4], 'performance': ['pass', 'fail', 'pass', 'fail', 'fail', 'pass'] } df = pd.DataFrame(data) # 直接生成整体性能列 df['overall performance'] = df.groupby('Asset')['performance'].transform( lambda x: 'fail' if (x == 'fail').any() else 'pass' ) print(df)
逻辑说明
两种方法的核心逻辑一致:
- 按
Asset列分组,对每组的performance值进行判断 - 只要组内存在至少一个
fail,该资产的所有行整体性能就设为fail;反之则设为pass
运行代码后即可得到你期望的输出结果。
内容的提问来源于stack exchange,提问作者SneakyCosmo
相关产品推荐
相关产品推荐

