Python如何实现类似SQL Server的ISNUMERIC功能修正pandas错位数据
原有代码错误原因
- 误用Python内置关键字
type作为列引用,没有正确指定prod表的type列,需写为prod['type'] np.isnumeric()不支持直接作用于pandas Series对象,需使用pandas自带的字符串方法.str.isnumeric()做整列数值判断- 存在语法错误:代码括号未配对闭合,运行时会直接触发语法报错
正确实现方式
核心判断逻辑:错位行的特征为type列填充了本应属于quantity列的数值,只要type列值为数值即判定为错位,交换两列值即可。
基础版本(仅判断正整数场景)
如果你的quantity列存储的都是正整数,可直接使用.str.isnumeric()实现:
import pandas as pd import numpy as np # 生成错位判断标记,fillna(False)用于规避空值返回NaN导致判断异常 is_misplaced = prod['type'].str.isnumeric().fillna(False) # 同时给两列赋值完成交换,无需额外备份原始值 prod['quantity'], prod['type'] = np.where( is_misplaced, (prod['type'], prod['quantity']), (prod['quantity'], prod['type']) ).T
通用版本(兼容带小数点、负号的数值场景)
.str.isnumeric()仅能识别正整数,如果你需要和SQL Server的ISNUMERIC()效果一致,支持判断带小数点、负号的数值,可使用自定义判断函数:
def is_numeric(val): try: float(val) return True except (ValueError, TypeError): return False # 生成错位判断标记 is_misplaced = prod['type'].apply(is_numeric) # 赋值修正 prod['quantity'], prod['type'] = np.where( is_misplaced, (prod['type'], prod['quantity']), (prod['quantity'], prod['type']) ).T
易读版本(分开赋值逻辑)
如果觉得上面的同时赋值写法不好理解,可分开赋值,注意要先备份原始列值避免覆盖:
# 备份原始值 original_quantity = prod['quantity'].copy() original_type = prod['type'].copy() # 生成判断标记 is_misplaced = prod['type'].apply(is_numeric) # 分别修正两列 prod['quantity'] = np.where(is_misplaced, original_type, original_quantity) prod['type'] = np.where(is_misplaced, original_quantity, original_type)
内容的提问来源于stack exchange,提问作者Ren Cantu
相关产品推荐
相关产品推荐

