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
相关产品推荐
相关产品推荐

