在Pandas中选取首个真值列的高效优化方案问询
Pandas中获取两列首个真值的高效优化方案
问题背景
现有如下结构的DataFrame:
| Set_One | Set_Two |
|---|---|
| 'Foo' | '' |
| '' | 'Bar' |
| 'Foo' | 'Bar' |
需要获取每行两列中的首个真值(此处空字符串为假值,非空字符串为真值),预期结果如下:
| Result |
|---|
| 'Foo' |
| 'Bar' |
| 'Foo' |
最初使用df.apply(lambda x : x.Set_One or x.Set_Two)实现需求,但数据集增大后性能明显下降;尝试直接写df['Set_One'] or df['Set_Two']会因Series真值歧义报错;使用&/|运算符无法适配字符串的真假判断逻辑。
最佳实践
方法1:Pandas原生where方法
利用Series.where()的向量化特性,直接实现逻辑:当Set_One为真值(非空)时保留原值,否则取Set_Two的值:
result = df['Set_One'].where(df['Set_One'] != '', df['Set_Two'])
这是最贴合Pandas风格的写法,完全基于原生向量化实现,性能远高于apply,代码简洁易读。
方法2:NumPynp.where方法
如果习惯用NumPy的API,也可以用np.where实现相同逻辑:
import numpy as np result = np.where(df['Set_One'] != '', df['Set_One'], df['Set_Two'])
同样是纯向量化操作,性能和Pandaswhere相当,适合需要和其他NumPy逻辑结合的场景。
关于np.vectorize的说明
你尝试的np.vectorize方法确实比apply快,但它本质是封装了循环的伪向量化,并非真正的底层向量化实现。相比之下,上面两种原生向量化方法不仅性能更优,代码也更简洁优雅,是这类场景的首选方案。
内容的提问来源于stack exchange,提问作者Ryan Honea
相关产品推荐
相关产品推荐

