如何避免DataFrame将字母数字ID误判为科学计数法显示inf
解决Pandas解析字母数字ID为科学计数法导致inf的问题
问题根源
核心问题在于:输入34E94591这类未加引号的内容时,Python会先将其解析为科学计数法表示的数值(即34 × 10^94591),这个数值远超出浮点数最大范围,直接变成inf,后续转字符串也无法恢复原始ID。而773E893E88因包含两个E,Python无法解析为数值,所以能保留字符串类型;纯数字ID则可正常解析为整数再转字符串。
解决方案
1. 手动构造DataFrame的场景
必须把所有ID以字符串字面量形式传入(加双/单引号),不让Python自动解析为数值:
import pandas as pd x = pd.DataFrame({'Id': ["34E94591", "122322", "773E893E88"]}, dtype=str) print(x.head())
执行后输出完全符合期望:
| Id | |
|---|---|
| 0 | 34E94591 |
| 1 | 122322 |
| 2 | 773E893E88 |
2. 使用Pygsheet读取Google Sheets的场景
要避免pandas自动推断类型,强制以字符串格式读取Id列:
- 方法一:先获取纯字符串格式的单元格值,再转DataFrame
import pygsheet import pandas as pd # 授权并打开目标表格 gc = pygsheet.authorize() sheet = gc.open("你的表格名称").sheet1 # 以字符串形式获取所有单元格值 values = sheet.get_all_values(returnas='matrix') # 转换为DataFrame,指定所有列类型为字符串 df = pd.DataFrame(values[1:], columns=values[0], dtype=str)
- 方法二:直接用
get_as_df()指定列类型
若你的pygsheet版本支持传递dtype参数,可直接强制Id列为字符串:
df = sheet.get_as_df(dtype={'Id': str})
也可以直接让整个DataFrame以字符串类型读取:
df = sheet.get_as_df(dtype=str)
验证效果
执行上述代码后,Id列的所有字母数字ID都会保留原始格式,不会再出现inf的错误。
内容的提问来源于stack exchange,提问作者TFan
相关产品推荐
相关产品推荐

