如何在if语句中使用dataframe.str.contains判断特定字符?
修正基于DataFrame列判断的Price计算代码
原代码的核心问题是:df['ColumnA'].str.contains('-')返回的是布尔类型的Series(每个元素对应一行的判断结果),而非单个布尔值,直接用is True做整体判断会导致逻辑完全错误——因为整个Series永远不可能等于单个True,最终会全部执行else分支或者触发错误。
以下是三种正确的实现方式:
方法1:使用numpy.where(推荐,向量化高效)
先统一转换列的数值类型,再通过numpy.where实现逐行条件判断:
import numpy as np # 提前转换数据类型,避免重复计算 df['ColumnB'] = df['ColumnB'].astype(float) df['ColumnC'] = df['ColumnC'].astype(float) # 按条件赋值Price列 df['Price'] = np.where( df['ColumnA'].str.contains('-'), df['ColumnB'] + df['ColumnC'] / 32, df['ColumnB'] / 32 )
方法2:使用df.loc条件索引
分两步赋值,先初始化默认值,再更新符合条件的行:
# 转换数据类型 df['ColumnB'] = df['ColumnB'].astype(float) df['ColumnC'] = df['ColumnC'].astype(float) # 先设置不包含'-'时的默认值 df['Price'] = df['ColumnB'] / 32 # 生成判断掩码,更新包含'-'的行 mask = df['ColumnA'].str.contains('-') df.loc[mask, 'Price'] = df.loc[mask, 'ColumnB'] + df.loc[mask, 'ColumnC'] / 32
方法3:使用apply逐行处理(适合复杂逻辑,效率较低)
通过自定义函数逐行判断计算,适合逻辑更复杂的场景:
def compute_price(row): col_b = float(row['ColumnB']) col_c = float(row['ColumnC']) if '-' in row['ColumnA']: return col_b + col_c / 32 else: return col_b / 32 df['Price'] = df.apply(compute_price, axis=1)
内容的提问来源于stack exchange,提问作者Yuuuu
相关产品推荐
相关产品推荐

