如何使用Pandas read_csv区分加载CSV中的缺失列值与带引号空字符串
如何使用Pandas read_csv区分加载CSV中的缺失列值与带引号空字符串
嘿,这个场景我之前处理过,确实Pandas默认的读取逻辑会把CSV里的两种空值混为一谈——不带引号的缺失字段(也就是,,这种)和带引号的空字符串(""),默认都会被转成NaN,但咱们可以通过调整读取参数轻松区分它们,实现你要的效果:把前者保留为NaN,后者保留为空字符串''。
先明确下你的CSV内容大概是这样的对吧?
id,name,age 1,,"25" 2,"",3 3,John,
接下来直接上解决方案,核心是借助Python标准库csv的引号控制参数,结合Pandas的read_csv来实现精准识别:
- 第一步,导入需要的库:
import pandas as pd import csv
- 第二步,用以下参数读取你的CSV文件:
df = pd.read_csv( 'your_file.csv', quoting=csv.QUOTE_NONNUMERIC, keep_default_na=True )
读取之后的结果完全符合你的需求:
- 第一行的
name字段(对应CSV里的,,)会被识别为NaN - 第二行的
name字段(对应CSV里的"")会被保留成空字符串'' - 第三行的
age字段(对应CSV里的末尾,,)会被识别为NaN - 带引号的数字比如
"25"会自动转成数值类型25.0,不带引号的数字3也会正常识别为数值
如果你不想让带引号的数字被自动转成数值,想统一先保留字符串类型,之后再手动转换的话,可以再加个dtype=str参数,之后按需转换数值列:
# 先全以字符串类型读取 df = pd.read_csv( 'your_file.csv', quoting=csv.QUOTE_NONNUMERIC, keep_default_na=True, dtype=str ) # 手动将id和age列转为数值类型,无法转换的(比如NaN)会保持原样 df['id'] = pd.to_numeric(df['id'], errors='coerce') df['age'] = pd.to_numeric(df['age'], errors='coerce')
这个方法的原理是csv.QUOTE_NONNUMERIC会告诉解析器:所有带引号的内容都当成字符串处理(空的引号就是空字符串),而不带引号的空内容则交给Pandas的默认逻辑识别为NaN,完美区分两种不同的空值情况~
内容来源于stack exchange
相关产品推荐
相关产品推荐

