如何基于多条件为Pandas DataFrame高效生成Result列?
Pandas高效生成result列的实现方案
需求说明
给定包含多列(示例为3列,实际50列)的DataFrame,需生成新列result,规则如下:
- 若该行任意列包含
'nok',则result = 'nok' - 若该行无
'nok'但任意列包含'deact',则result = 'deact' - 其余情况
result = 'ok'
高效实现代码
由于涉及50列,必须采用矢量化操作(底层C实现,避免Python循环开销),代码如下:
import pandas as pd import numpy as np # 构造示例数据 data = [ ['ok', 'ok', 'ok'], ['ok', 'nok', 'nok'], ['deact', 'ok', 'ok'], ['deact', 'ok', 'nok'], ] df = pd.DataFrame(data, columns=['col1', 'col2', 'col3']) # 1. 矢量化判断每行是否存在'nok' has_nok = df.eq('nok').any(axis=1) # 2. 矢量化判断每行是否存在'deact' has_deact = df.eq('deact').any(axis=1) # 3. 嵌套条件生成result列 df['result'] = np.where(has_nok, 'nok', np.where(has_deact, 'deact', 'ok'))
结果验证
执行后DataFrame的result列符合预期:
| col1 | col2 | col3 | result |
|---|---|---|---|
| ok | ok | ok | ok |
| ok | nok | nok | nok |
| deact | ok | ok | deact |
| deact | ok | nok | nok |
效率说明
df.eq('xxx')快速生成布尔值DataFrame,批量匹配所有列的目标值.any(axis=1)沿行方向判断是否存在匹配值,时间复杂度为O(n)(n为列数)- 全程无Python层面的循环,处理50列时效率远高于逐行遍历
内容的提问来源于stack exchange,提问作者Koke Abeke
相关产品推荐
相关产品推荐

