如何防止Python/pandas将id视为数字

Fra*_*tes 3 python pandas google-colaboratory

我有一个 csv 数据集,其中一些 id 是非常长的数字,如下所示:

963839330864351104
426545668232740352
811862613586429056
Run Code Online (Sandbox Code Playgroud)

当我读取 csv 并将数据集转换为数据框时,pandas 错误地认为它是一个数字并将其转换为科学通知,因此上面的数字变成了这样:

9.638393308643511e+17
4.2654566823274035e+17
8.11862613586429e+17
Run Code Online (Sandbox Code Playgroud)

我尝试通过将系列转换为 int64 来解决这个问题,这在大多数情况下都有效,但问题是:

有些数字原本可能是这样的

191268415833367997
Run Code Online (Sandbox Code Playgroud)

现在,当数字从科学记数法变为 int64(或 int)后,数字变成这样:

191268415833368000 #some how pandas think that it's ok to round the number up
Run Code Online (Sandbox Code Playgroud)

我需要的是让 pandas 明白数据集中保存这些 id 的列是一个字符串列,它不应该被视为数字,可能是在导入时,所以我不会将数字转换为整数,然后再转换为字符串当我格式化工作并转换我的数据集以满足我的需求时。

我尝试过以下操作但没有成功:

  1. 我尝试将系列转换为 int 和 int64
  2. 我尝试使用 float_ precision='round_trip' 读取 csv
  3. 我尝试将包含 id 的系列转换为字符串
  4. 我尝试以不同的方式设置显示: pd.options.display.float_format = '{:.0f}'.format

我看到这个问题以不同的方式被问到,但没有明确的答案或我能够理解的东西来适应我的问题。它应该是直截了当的,但不知怎的却并非如此。

非常感谢您的帮助。

Cam*_*ell 6

既然您提到您正在从 csv 加载,您可以简单地告知pandas您想要将该列视为字符串:

from io import StringIO
from pandas import read_csv

data = StringIO('''
id1,id2
963839330864351104,963839330864351104
426545668232740352,426545668232740352
811862613586429056,811862613586429056
191268415833367997,191268415833367997
''')

df = read_csv(data, dtype={'id1': str, 'id2': float})

print(
    df, df.dtypes, sep='\n'*2
)
                  id1           id2
0  963839330864351104  9.638393e+17
1  426545668232740352  4.265457e+17
2  811862613586429056  8.118626e+17
3  191268415833367997  1.912684e+17

id1     object
id2    float64
dtype: object
Run Code Online (Sandbox Code Playgroud)

在这种情况下,read_csv将被视为'id1'字符串值和'id2'数字(浮点)值,因为它检测到这些值是浮点数。