如何让pandas.read_csv根据列类型差异化处理缺失值?
问题:CSV读取的差异化空白值处理
需求:读取CSV文件时,将数值类列的空白值识别为NaN,字符串类列的空白值识别为空字符串,且无需预先了解列信息。
测试文件test.csv内容
StrCol,FloatCol a,1.0 b,1.1 ,1.2 d, e,1.3
期望输出DataFrame
StrCol FloatCol 0 a 1.0 1 b 1.1 2 1.2 3 d NaN 4 e 1.3
当前可行代码
df = pd.read_csv("test.csv") sc = [c for c, dt in df.dtypes.items() if dt == object] df.loc[:, sc] = df.loc[:, sc].fillna('')
询问:是否存在更优雅的实现方案,比如通过read_csv的参数直接实现该效果?
解决方案
Pandas的read_csv没有能直接实现该需求的单一参数,但可以通过更简洁的代码逻辑或读取阶段的转换器来优化,以下是两种更优雅的实现方式:
方式1:简化后续处理逻辑
直接在读取后用一行代码完成差异化填充,无需单独筛选列:
df = pd.read_csv("test.csv").apply(lambda col: col.fillna('') if col.dtype == object else col)
或者用assign方法,在大数据集上性能更稳定:
df = pd.read_csv("test.csv") df = df.assign(**{col: df[col].fillna('') for col in df.select_dtypes('object').columns})
方式2:读取阶段用转换器处理
先读取少量数据推断列类型,再为字符串列设置转换器,读取时直接完成空白值替换:
# 读取一行数据推断列类型 sample = pd.read_csv("test.csv", nrows=1) str_cols = sample.select_dtypes('object').columns.tolist() # 定义转换器:字符串列空白值转为空串,其他列保持默认(空白转NaN) converters = {col: lambda x: x if x.strip() else '' for col in str_cols} df = pd.read_csv("test.csv", converters=converters)
补充说明
- 无法用单一
read_csv参数实现的原因:na_values、keep_default_na这类参数是全局生效的,无法区分数值列和字符串列做差异化处理。 - 上述两种方法都不需要预先手动指定列信息,完全依赖Pandas的自动类型推断。
内容的提问来源于stack exchange,提问作者rowan_uk
相关产品推荐
相关产品推荐

