Pandas基于两列创建新列:布尔列控制字母大小写转换实现问题
问题原因
- 你写的apply是单独对
Letters列的每一个值做处理,lambda函数的参数x只代表当前行的字母内容,没法直接关联到同一行的bool_array值 - 代码里的
df['bool_array']是整列的Series对象,不是当前行的布尔值,拿整个Series和True做is判断永远返回False,所以所有行都会保留原小写字母 - 额外说明:
is是用来判断两个对象的内存身份是否一致的,判断布尔值是否相等直接用布尔值本身即可,不需要额外加is True
正确实现方式
方式1:逐行apply(适合小数据量,逻辑直观)
对整个DataFrame按行应用函数,取每行的两列值做判断:
df['result_seq'] = df.apply(lambda row: row['Letters'].upper() if row['bool_array'] else row['Letters'], axis=1)
方式2:向量化操作(适合大数据量,性能更高)
用Pandas原生的向量化方法,避免逐行遍历的开销:
df['result_seq'] = df['Letters'].str.upper().where(df['bool_array'], df['Letters'])
也可以用numpy的where实现,逻辑更清晰:
import numpy as np df['result_seq'] = np.where(df['bool_array'], df['Letters'].str.upper(), df['Letters'])
内容的提问来源于stack exchange,提问作者omer.moses
相关产品推荐
相关产品推荐

