如何用numpy.where检查DataFrame字符串数值的小数位数与范围并标记问题
用numpy.where标记字符串格式数值的异常项
核心思路
要实现需求,需分两步处理两个判断条件,再通过numpy.where组合条件生成标记列:
- 分析字符串格式数值的小数位数
- 转换数值后判断是否在指定范围内
- 用逻辑与组合两个条件,满足时标记
issues,否则留空
代码实现
首先构造示例DataFrame:
import pandas as pd import numpy as np # 示例数据 df = pd.DataFrame({ 'value_str': ['12.34', '56', '-99.9', '201.00', '-101.12', '150.78'] })
步骤1:计算小数位数
通过字符串方法判断是否含小数点,再提取小数部分长度:
# 判断是否包含小数点 has_decimal = df['value_str'].str.contains('\.', regex=True) # 计算小数位数:有小数点取小数部分长度,无则为0 decimal_places = np.where( has_decimal, df['value_str'].str.split('.').str[1].str.len(), 0 )
步骤2:转换数值并判断范围
将字符串转为数值型,方便范围校验:
# 转换为数值(默认所有字符串都是合法数值,若有异常可加errors='coerce') num_values = pd.to_numeric(df['value_str']) # 判断是否在[-100, 200]范围外 out_of_range = (num_values < -100) | (num_values > 200)
步骤3:生成标记列
组合两个条件,用numpy.where生成结果:
# 组合条件:小数位数≠2 且 数值超出范围 condition = (decimal_places != 2) & out_of_range # 添加新列 df['check_result'] = np.where(condition, 'issues', '')
运行结果
执行后DataFrame内容:
value_str check_result 0 12.34 1 56 2 -99.9 3 201.00 issues 4 -101.12 issues 5 150.78
补充说明
- 所有操作均使用矢量化方法,未用到
apply,效率更高 - 若存在无法转换为数值的字符串,可在
pd.to_numeric中添加errors='coerce',并额外处理NaN的情况(比如将其也标记为issues)
内容的提问来源于stack exchange,提问作者sadaa
相关产品推荐
相关产品推荐

