Pandas (Python) 阅读和处理 Java BigInteger/大数

Pandas (Python) reading and working on Java BigInteger/ large numbers

我有一个包含 Nilsimsa 散列值的数据文件 (csv)。其中一些可能长达 80 个字符。我希望在 Python 中阅读它们以进行数据分析任务。有没有办法在不丢失信息的情况下导入python中的数据?

编辑: 我已经尝试了评论中提出的实现,但这对我不起作用。 csv 文件中的示例数据为:77241756221441762028881402092817125017724447303212139981668021711613168152184106

从一个简单的文本文件开始读入,只有一个变量和一行。

%more foo.txt
x
77241756221441762028881402092817125017724447303212139981668021711613168152184106

In [268]: df=pd.read_csv('foo.txt')

Pandas 会将其作为字符串读入,因为它太大而无法存储为 int64 或 float64 等核心数字类型。但是信息就在那里,你没有丢失任何东西。

In [269]: df.x
Out[269]: 
0    7724175622144176202888140209281712501772444730...
Name: x, dtype: object

In [270]: type(df.x[0])
Out[270]: str

并且您可以使用普通 python 将其视为数字。回想一下评论中链接中的注意事项,这不会像 numpy 和 pandas 中的东西那样快,您将整列存储为 int64。这是使用更灵活但更慢的对象模式来处理事情。

您可以像这样更改要存储为 long(长整数)的列。 (但请注意,dtype 仍然是对象,因为除了核心 numpy 类型(int32、int64、float64 等)之外的所有内容都存储为对象。)

In [271]: df.x = df.x.map(int)

然后可以或多或少地把它当作一个数字。

In [272]: df.x * 2
Out[272]: 
0    1544835124428835240577628041856342500354488946...
Name: x, dtype: object

您必须进行一些格式化才能看到完整的数字。或者走默认显示整数的 numpy 路线。

In [273]: df.x.values * 2
Out[273]: array([ 154483512442883524057762804185634250035448894606424279963336043423226336304368212L], dtype=object)

正如@JohnE 在他的回答中所解释的那样,我们在使用 Pandas 读取大数字时不会丢失任何信息。它们存储为dtype=object,为了对它们进行数值计算,我们需要将这些数据转换为数值类型。

对于系列:

我们必须将 map(func) 应用于数据框中的系列:

df['columnName'].map(int)

整个数据框:

如果由于某种原因,我们的整个数据框由具有 dtype=object 的列组成,我们查看 applymap(func)

来自 Pandas 的文档:

DataFrame.applymap(func): Apply a function to a DataFrame that is intended to operate elementwise, i.e. like doing map(func, series) for each series in the DataFrame

因此要转换数据框中的所有列:

 df.applymap(int)