apply(int)在Pandas中将字符串转换为int时出现问题

lhcgjxsq  于 2022-12-25  发布在  其他
关注(0)|答案(2)|浏览(177)

这个问题紧接着这个问题:Problem in Pandas : impossible to do sum of int with arbitrary precision,我使用了此处的公认答案:第一个月
但它并非在所有情况下都有效。
例如,对于此文件

my_int
9220426963983292163
5657924282683240

输出为-9220659185443576213
在看了apply(int)的输出之后,我理解了问题所在,在本例中,apply(int)返回dtype:int64

0    9220426963983292163
1       5657924282683240
Name: my_int, dtype: int64

但是对于较大的数字,它返回dtype:object

0    1111111111111111111111111111111111111111111111...
1    2222222222222222222222222222222222222222222222...
Name: my_int, dtype: object

有可能用Pandas来解决吗?或者我应该按照上一个问题的Tim Robert's answer来解决?

编辑1:

糟糕的解决方案。在文件末尾添加一行大整数

my_int
9220426963983292163
5657924282683240
11111111111111111111111111111111111111111111111111111111111111111111111111

之后,对除最后一行之外的所有行进行求和:

data['my_int'].apply(int).iloc[:-1].sum()
kzipqqlq

kzipqqlq1#

使用Pandas的解决方案:

sum(data[`my_int`].apply(int).to_list())

"我为什么这么说"
df1

my_int
9220426963983292163
5657924282683240

df2

my_int
9220426963983292163
5657924282683240
11111111111111111111111111111111111111111111111111111111111111111111111111

S1S2分别表示df1df2中的列my_int中的元素的总和:

S1 = 9226084888265975403
S2 = 11111111111111111111111111111111111111111111111111111120337195999377086514

如果我们查看NumPy on Overflow错误的文档,我们会发现NumPy提供的精度有限:

>>> np.iinfo(int)
iinfo(min=-9223372036854775808, max=9223372036854775807, dtype=int64)

可表示的最大数小于S1S2
该解决方案没有任何问题,并给出正确的总和:

>>> df2['my_int'].sum()
9220426963983292163565792428268324011111111111111111111111111111111111111111111111111111111111111111
>>> 
>>> df2['my_int'].astype(object).sum()
9220426963983292163565792428268324011111111111111111111111111111111111111111111111111111111111111111
>>>
>>> sum(df2['my_int'].apply(int).to_list())
11111111111111111111111111111111111111111111120337195999377086514

编辑:首选sum而非np.sum

>>> np.sum(df1['my_int'].apply(int).to_list())
>>> -9220659185443576213
>>> sum(df1['my_int'].apply(int).to_list())
>>> 9226084888265975403

my_int列中元素总和的计算来源是Wolfram Alpha:df1df2

hgb9j2n6

hgb9j2n62#

溶液:

df["my_int"].apply(int).astype(object).sum()

apply(int):避免字符串与大数字串联。
astype(object):将int64转换为object

相关问题