在实际的数据处理场景中,CSV文件是非常常见的数据存储格式,但很多时候我们拿到的CSV文件中,本该是数值类型的列里会混入各种非数值数据,比如空字符串、字母、特殊符号甚至是格式错误的日期内容,这些非数值数据会导致后续做数值计算、统计分析时出现报错或者结果偏差,因此需要针对性地对数值列做清洗处理。

常见的非数值数据类型
在CSV的数值列中,常见的非数值数据可以分为以下几类:
- 空值类:包括空字符串、
NaN、None等缺失值标识 - 文本类:列中混入的字母、汉字、无意义文本字符串
- 符号类:比如千分位逗号、货币符号、百分号等干扰符号
- 格式错误类:比如日期被错误存到数值列、数值带单位等
使用pandas识别数值列中的非数值数据
我们可以借助pandas库读取CSV文件后,先定位数值列,再识别其中的非数值内容,示例代码如下:
import pandas as pd
# 读取CSV文件
df = pd.read_csv("test_data.csv")
# 假设要处理的数值列名为score
target_col = "score"
# 先将列尝试转换为数值类型,无法转换的会变为NaN
df[target_col] = pd.to_numeric(df[target_col], errors="coerce")
# 筛选出非数值所在的行
invalid_rows = df[df[target_col].isna()]
print("非数值数据所在行:")
print(invalid_rows)
非数值数据的处理方案
1. 替换异常值为默认值
如果非数值数据占比很小,且业务允许用默认值填充,可以直接替换:
# 将非数值替换为0,也可以替换为列的平均值等
default_value = 0
df[target_col] = df[target_col].fillna(default_value)
print("替换后的列数据:")
print(df[target_col].head())
2. 删除包含非数值的行
如果非数值数据属于无效样本,可以直接删除对应行:
# 删除数值列中为NaN的行
df_clean = df.dropna(subset=[target_col])
print("删除无效行后的数据量:", len(df_clean))
3. 清洗后再转换
如果非数值是带符号的数值,比如1,000、99%,可以先做清洗再转换:
import pandas as pd
df = pd.read_csv("test_data.csv")
target_col = "score"
# 定义清洗函数,去除千分位逗号和百分号
def clean_value(val):
if isinstance(val, str):
# 去除逗号和百分号
val = val.replace(",", "").replace("%", "")
return val
# 先清洗列内容
df[target_col] = df[target_col].apply(clean_value)
# 再转换为数值类型
df[target_col] = pd.to_numeric(df[target_col], errors="coerce")
print("清洗转换后的列数据:")
print(df[target_col].head())
注意事项
处理数值列的非数值数据时,需要先和业务方确认非数值的产生原因,避免盲目删除或替换导致数据失真。另外如果CSV文件编码不是默认的utf-8,读取时需要指定正确的编码参数,避免出现乱码导致识别非数值错误。