Pandas使用read_excel读取Excel时整数转float如何保留原字符串值
问题原因
该问题本质是pandas读取Excel的自动类型推断逻辑导致的:常规格式的数值列如果存在空值,pandas会默认将整列推断为float类型(原生int类型无法存储NaN);即使没有空值,Excel数值默认按浮点数存储的规则也会被pandas识别为float。你直接用
dtype或converters指定转字符串时,本质是对已经转换完成的float结果做二次转换,所以会自带.0后缀。
可行解决方案
方案1:使用openpyxl引擎的convert_float参数(最便捷)
读取时指定引擎为openpyxl,开启convert_float参数自动将无小数部分的float转成int,再转字符串就不会出现.0后缀:
import pandas as pd df = pd.read_excel( r'C:\test.xlsx', 'Sheet0', skiprows=1, engine='openpyxl', convert_float=True, # 自动将无小数部分的浮点数值转成int dtype={'目标列名': str} # 直接指定目标列转为字符串,无.0后缀 )
方案2:直接读取单元格原始文本(完全避免类型推断,适合复杂格式场景)
如果需要100%还原Excel单元格的原始内容,可以直接用openpyxl读取单元格值后构造DataFrame,完全跳过pandas的自动类型转换逻辑:
from openpyxl import load_workbook import pandas as pd import numpy as np wb = load_workbook(r'C:\test.xlsx', data_only=True) ws = wb['Sheet0'] data = [] # min_row=2对应原参数skiprows=1,跳过第一行 for row in ws.iter_rows(min_row=2, values_only=True): processed_row = [] for idx, cell_val in enumerate(row): # 假设目标列是第3列,索引从0开始为2,可自行修改列索引 if idx == 2: if isinstance(cell_val, float) and not np.isnan(cell_val) and cell_val.is_integer(): processed_row.append(str(int(cell_val))) else: processed_row.append(str(cell_val) if cell_val is not None else '') else: processed_row.append(cell_val) data.append(processed_row) # 自行替换为实际表头 df = pd.DataFrame(data, columns=['列1', '列2', '目标列', '其他列'])
方案3:读取后批量处理列(适合已读入数据不想重新加载的场景)
如果数据已经读入DataFrame,可以直接对目标列做后处理:
import numpy as np # 方法1:针对数值类型列做转换 df['目标列'] = df['目标列'].apply( lambda x: str(int(x)) if isinstance(x, float) and not np.isnan(x) and x.is_integer() else str(x) if x is not None else '' ) # 方法2:针对已经转为字符串、带.0后缀的列做处理 df['目标列'] = df['目标列'].str.replace(r'\.0$', '', regex=True)
内容的提问来源于stack exchange,提问作者Shark00n
相关产品推荐
相关产品推荐

