Pandas read_csv如何处理整数列含字符串引发的数据类型解析错误行
Pandas read_csv如何处理整数列含字符串引发的数据类型解析错误行
嗨,我完全懂你的困扰——on_bad_lines='skip/warn'确实只负责处理解析层面的问题(比如列数不匹配、分隔符异常这类),碰到整数列里混了字符串这种数据类型不匹配的情况,它就完全不管用了。针对你给出的CSV和需求,我给你几个实用的解决方案:
方案一:用converters自定义转换逻辑,灵活处理错误值
你可以给需要转换的列指定自定义函数,遇到无法转成整数的情况时,要么返回空值(比如pd.NA),要么标记成特定值,后续再处理。
比如针对你的id和age列,写个安全转换整数的函数:
import pandas as pd def safe_to_int(value): try: return int(value.strip()) # 先去掉可能的引号或空格 except (ValueError, TypeError): return pd.NA # 转失败就返回空值 # 这里只给不需要自定义转换的列指定dtype,自定义的放converters里 schema = {'name': 'str'} df = pd.read_csv('a.csv', dtype=schema, converters={'id': safe_to_int, 'age': safe_to_int}, engine='python') # 之后你可以选择删掉有错误值的行 df_clean = df.dropna(subset=['id', 'age']) # 或者把空值填充成默认值,再转成int类型 df['id'] = df['id'].fillna(0).astype('int64')
方案二:先宽松读入,再批量转换并过滤错误行
如果不想写太多自定义函数,可以先不指定dtype,把所有数据读进来后,用pd.to_numeric批量处理整数列,把转换失败的转为空值,再过滤掉这些行:
import pandas as pd # 先不指定dtype,宽松读入 df = pd.read_csv('a.csv', engine='python') # 对id和age列做数值转换,错误值转成NaN df['id'] = pd.to_numeric(df['id'], errors='coerce') df['age'] = pd.to_numeric(df['age'], errors='coerce') # 删掉包含空值的行(也就是原来转换失败的行) df_clean = df.dropna(subset=['id', 'age']) # 最后统一转成目标数据类型 df_clean = df_clean.astype({'id': 'int64', 'name': 'str', 'age': 'int64'})
方案三:自定义on_bad_lines函数,直接跳过错误行
如果你想在读取时就直接跳过那些整数列含字符串的行,可以给on_bad_lines传一个自定义检查函数(注意必须用Python引擎):
import pandas as pd def filter_bad_lines(line): # line是当前行的列表形式,比如第一行数据是['1', '', '25'] try: # 检查id是否能转成整数 int(line[0].strip()) # 检查age是否能转成整数 int(line[2].strip()) return line # 没问题就保留该行 except ValueError: return None # 返回None就会跳过该行 schema = {'id':'int64','name':'str','age':'int'} df = pd.read_csv('a.csv', dtype=schema, on_bad_lines=filter_bad_lines, engine='python')
这个方法会在读取每一行时直接检查数据是否符合整数要求,不符合的直接跳过,适合你想直接丢弃错误行的场景。
针对你给出的示例CSV,第三行的jj(id列)和空字符串(age列)都会被上面的方法正确处理,不会再触发类型转换错误啦。
内容来源于stack exchange
相关产品推荐
相关产品推荐

