Pandas读取CSV时数值列出现多余.0的问题及疑问
问题解答
疑问1:为何CSV文件存在空行时,数值列会出现.0?
当CSV中存在空行时,对应行的Order No.列单元格为空值。Pandas读取数据时,整数类型无法存储空值,因此会自动将该列的数据类型从int转换为float(因为float类型可以用NaN表示空值)。原本的整数会被强制转换为浮点数形式,所以输出时就会带上.0。
疑问2:为何重命名列后无法成功转换数据类型?
你尝试的v_df[['Order_Id']] = v_df[['Order_Id']].values.astype('str')并不是转换失败,而是转换逻辑不对:
- 此时
Order_Id列的 dtype 是float,直接转字符串会把149545961155429.0这种浮点数原样转为字符串,自然保留.0。 - 另外,用
.values返回的是numpy数组,直接赋值会绕开Pandas的类型推断,但核心问题是没先处理浮点数的小数部分。
解决方案(去除.0)
方案1:读取阶段直接指定原列类型(推荐)
不需要纠结重命名的问题,先在读取CSV时指定原列Order No.的类型,之后再重命名即可:
import pandas as pd # 方法A:指定为字符串类型 v_df = pd.read_csv('csvfile', delimiter=';', dtype={'Order No.': 'str'}) v_df = v_df.rename(columns={'Order No.': 'Order_Id'}) # 方法B:指定为可空整数类型(Pandas 1.0+支持) v_df = pd.read_csv('csvfile', delimiter=';', dtype={'Order No.': 'Int64'}) v_df = v_df.rename(columns={'Order No.': 'Order_Id'})
这样读取后的数据不会出现.0,空行对应的值会显示为NaN(方法B)或空字符串(方法A)。
方案2:读取后处理列数据
如果已经读取完数据,可通过以下方式去除.0:
方式1:转为可空整数后转字符串
# 先将float列转为可空整数(自动去掉.0),再转字符串 v_df['Order_Id'] = v_df['Order_Id'].astype('Int64').astype('str') # 替换空值显示为你需要的内容,比如空字符串 v_df['Order_Id'] = v_df['Order_Id'].replace('NaN', '')
方式2:直接处理浮点数转字符串
# 对非空值取整后转字符串,空值留空 v_df['Order_Id'] = v_df['Order_Id'].apply(lambda x: str(int(x)) if pd.notna(x) else '')
方案3:跳过CSV中的空行
如果空行没有业务意义,可以直接在读取时跳过:
v_df = pd.read_csv('csvfile', delimiter=';', skip_blank_lines=True) v_df = v_df.rename(columns={'Order No.': 'Order_Id'}) # 若仍有带空格的"伪空行",可读取后删除全空行 v_df = v_df.dropna(how='all')
这样列会保持整数类型,不会出现.0。
内容的提问来源于stack exchange,提问作者WAQ
相关产品推荐
相关产品推荐

