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)
我有一个包含 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)