You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas使用np.where条件赋值时保留指定值的技术问题

解决np.where覆盖已有值的问题

嘿,我完全懂你遇到的困扰——第二次执行np.where的时候,把之前已经设置为s的第一行col1给改成x了,这可不是你想要的结果对吧?

问题出在哪?

你第二次写的代码里,np.where会对所有行进行判断:

df['col1'] = np.where((df['col1'] != 's') & ..., 'z','x')

对于第一行来说,df['col1'] != 's'是False,所以代码会把col1设为'x',直接覆盖了之前的s。这就是为什么结果里第一行变成了x。

解决方案:保留已有的s值

我们需要在后续赋值时,优先保留已经设置好的s,只对非s的行进行条件判断。这里有两种常用的方法:

方法1:嵌套np.where(完全贴合你的期望结果)

先判断当前col1是不是s,如果是就直接保留;否则再判断是否符合col2含e且col3含f的条件,分别赋值z或x:

df['col1'] = np.where(
    df['col1'] == 's',  # 先锁定要保留的s值
    's',
    np.where(
        (df['col2'].str.contains('e', case=False, regex=True, na=False)) & 
        (df['col3'].str.contains('f', case=False, regex=True, na=False)),
        'z',
        'x'
    )
)

方法2:用原列值作为默认值(适合保留非s行原有值的场景)

如果你希望非s行里,不满足条件的保持原来的o而不是改成x,可以把默认值设为df['col1'],这样只会修改符合条件的非s行:

df['col1'] = np.where(
    (df['col1'] != 's') & 
    (df['col2'].str.contains('e', case=False, regex=True, na=False)) & 
    (df['col3'].str.contains('f', case=False, regex=True, na=False)),
    'z',
    df['col1']  # 非条件行保留原有值,包括s
)

执行后的结果

用方法1执行后,你就能得到期望的结果:

col1 col2 col3
s    b    c
z    e    f
x    h    i

内容的提问来源于stack exchange,提问作者satoshi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:08:07