如何在不遍历行的情况下为Pandas DataFrame实现指定映射?
解决方案
可以利用Pandas的矢量化字符串方法结合numpy的条件处理能力,完全避免逐行遍历,效率远高于循环:
方法一:用np.select实现多条件映射
import pandas as pd import numpy as np # 构造示例DataFrame df = pd.DataFrame({'id': [1,2,3], 'letter': ['x,y', 'z', 'a']}) # 定义判断条件与对应值 conditions = [ df['letter'].str.contains('x'), df['letter'].str.contains('z') ] values = [1, 2] # 生成map列,未匹配的情况默认赋值0 df['map'] = np.select(conditions, values, default=0)
方法二:链式布尔索引赋值
也可以通过布尔索引直接批量赋值,注意条件顺序(优先级高的条件后执行,避免被覆盖):
df['map'] = 0 # 先设置全局默认值 df.loc[df['letter'].str.contains('z'), 'map'] = 2 df.loc[df['letter'].str.contains('x'), 'map'] = 1 # 后处理x的条件,保证其优先级
两种方法都能得到目标结果:
| id | letter | map |
|---|---|---|
| 1 | x,y | 1 |
| 2 | z | 2 |
| 3 | a | 0 |
关键说明
str.contains是Pandas原生的矢量化字符串方法,会对整列数据批量执行包含判断,返回布尔数组,无需逐行操作np.select适合多分支的条件映射场景,按条件顺序依次匹配赋值- 链式赋值时,优先级高的条件要放在后面执行,确保其结果不会被低优先级条件覆盖
内容的提问来源于stack exchange,提问作者learner
相关产品推荐
相关产品推荐

