You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 06:35:25