Python Pandas新手求助:按SKU前缀批量调整bottlePrice列值
基于SKU前缀计算新价格列的解决方案
问题分析
你之前的代码存在两个核心问题:
- 直接对筛选后的行使用
apply,会导致未匹配条件的行新列值为缺失值(NaN) - 未指定
axis=1时,apply默认对列操作,lambda中的x是整列数据而非目标列;若指定axis=1,x代表整行,直接乘系数会修改所有列,而非仅bottlePrice
正确实现方法
方法一:使用loc定位赋值(推荐,高效直观)
分步操作逻辑清晰,新手易理解调试:
# 先将原bottlePrice值复制到新列作为基础 x["new_bottle_price"] = x["bottlePrice"].copy() # 对SKU以BA开头的行,新价格乘以1.3 x.loc[x["SKU"].str.startswith("BA"), "new_bottle_price"] *= 1.3 # 对SKU以BF开头的行,新价格乘以1.1 x.loc[x["SKU"].str.startswith("BF"), "new_bottle_price"] *= 1.1
方法二:使用apply结合自定义函数
适合后续需要扩展更多前缀规则的场景:
def get_new_price(row): if row["SKU"].startswith("BA"): return row["bottlePrice"] * 1.3 elif row["SKU"].startswith("BF"): return row["bottlePrice"] * 1.1 # 其他前缀返回原价格,可根据需求修改 else: return row["bottlePrice"] # 按行应用函数生成新列 x["new_bottle_price"] = x.apply(get_new_price, axis=1)
也可以写成简洁的lambda形式:
x["new_bottle_price"] = x.apply( lambda row: row["bottlePrice"] * 1.3 if row["SKU"].startswith("BA") else row["bottlePrice"] * 1.1 if row["SKU"].startswith("BF") else row["bottlePrice"], axis=1 )
注意事项
- 确保
SKU列是字符串类型,若不是可先转换:x["SKU"] = x["SKU"].astype(str) - 若存在空值,可添加
na=False参数忽略:x["SKU"].str.startswith("BA", na=False)
内容的提问来源于stack exchange,提问作者Umut KAAN BIÇAK
相关产品推荐
相关产品推荐

