使用Pandas导入数据时如何按要求指定字符串、数值列的dtype?
解决方案
报错原因
- 普通Python原生
int/float类型不支持空值,当列中存在空字符串时强制转换会抛出ValueError - 直接指定
dtype={'c': int}时,pandas会尝试将所有值(包括空值)转成原生int,无法处理空值就会报错 - 列
b被自动识别为数值类型时,前导零会被自动舍弃,必须手动指定该列类型为str才能保留原始格式
最简实现(一步到位)
直接使用pandas提供的**可空整数类型Int64(首字母大写)**处理空值,同时指定字符串列类型为str即可:
import io import pandas as pd s = """a,b,c,d a1,,1,1.2 a2,00,,3.3 a3,01,3,2.3 a4,10,4,1.3""" df = pd.read_csv(io.StringIO(s), dtype={'a': str, 'b': str, 'c': 'Int64', 'd': float}, # 如果需要保留b列的空值为原始空字符串而非NaN,加下面这行 # keep_default_na=False )
输出结果:
a b c d 0 a1 NaN 1 1.2 1 a2 00 <NA> 3.3 2 a3 01 3 2.3 3 a4 10 4 1.3
如果需要保留b列的空值为原始空字符串,取消注释keep_default_na=False即可,此时输出的b列第一行为空字符串,完全保留原始输入格式。
分步转换方案(兼容旧版pandas)
如果使用的pandas版本不支持可空类型,可以先全量读为字符串保证b列格式正确,再用pd.to_numeric处理数值列的空值:
# 全量读为字符串,关闭空值过滤保证原始格式完全保留 df = pd.read_csv(io.StringIO(s), dtype=str, na_filter=False) # 转换c列,空字符串自动转NaN df['c'] = pd.to_numeric(df['c'], errors='coerce') # 转换d列 df['d'] = pd.to_numeric(df['d'], errors='coerce')
内容的提问来源于stack exchange,提问作者wsdzbm
相关产品推荐
相关产品推荐

