如何将含int/float/string的CSV数据转换为仅含string和float类型
问题场景
待处理CSV文件包含float、int、string三种数据类型,处理目标为仅保留string、float两类数据:仅将所有int类型内容转换为float类型,其余类型数据保持原样。
此前使用如下代码尝试全表类型转换:
df=df.astype(dtype=np.float64, copy=True, errors='raise')
代码运行报错原因:全局强制将所有数据转为np.float64时,表中存在的string类型内容无法完成浮点转换,触发类型错误。
解决方案
不要直接对全表执行统一的astype(np.float64)转换,按数据类型筛选后定向处理整数类型内容即可,根据数据规整程度选择对应方法:
- 规整数据表(每列类型统一):按列类型筛选后批量转换
先识别所有整数类型的列,仅对这类列执行浮点转换,原有字符串列、浮点列不做任何改动,代码如下:
import numpy as np import pandas as pd # 读入目标CSV文件 df = pd.read_csv("你的CSV文件本地路径.csv") # 筛选所有整数类型的列,统一转为float64 int_columns = df.select_dtypes(include="int").columns df[int_columns] = df[int_columns].astype(np.float64) # 打印各列类型校验转换结果 print(df.dtypes)
注意:如果CSV读入时因为空值、列内存在混合值,导致整数列被自动识别为object类型,该方法会漏判,需使用下面的混合类型处理方案。
- 非规整数据表(列内存在混合类型):逐元素判断类型后转换
不按整列做类型强制,对表中每个元素单独判断:如果元素是int类型就转为float,字符串、原有浮点值直接保留,代码如下:
def int_to_float(element): if isinstance(element, int): return float(element) return element # pandas版本低于2.1.0用applymap df = df.applymap(int_to_float) # pandas版本2.1.0及以上用map替换applymap # df = df.map(int_to_float)
避坑提示
全表统一指定astype(np.float64)的逻辑会尝试将所有单元格内容转为浮点类型,遇到字符串内容必然抛出转换错误,无法满足保留字符串列的需求。
内容的提问来源于stack exchange,提问作者notsaggin
相关产品推荐
相关产品推荐

