pandas 可以在没有任何警告的情况下截断我的数据并导致无法挽回的数据丢失吗?

Can pandas truncate my data and cause irreparable data loss without any kind of warning whatsoever?

import pandas as pd
import io

indata = io.StringIO("c\n10000000000")

df = pd.read_csv(indata, header=0)
print(df)

indata.seek(0)

df = pd.read_csv(indata, header=0, dtype={"c":int})
print(df)

预期输出:

             c
0  10000000000
            c
0  10000000000

实际输出:

             c
0  10000000000
            c
0  1410065408

pandas 可以在没有任何警告的情况下以这种方式截断我的数据吗?

我绞尽脑汁想弄清楚为什么我的脚本不起作用(当然这是一个玩具示例。我的脚本更复杂)。经过 45 分钟的绝望(还试图找出 pandas 分配给我的列的数据类型),我刚刚发现了上面的行为。

我在我的真实脚本中设置了 dtype,因为 pandas 一直将该列作为 float 加载,但我需要它作为 int 进行比较。

编辑:评论中要求的附加信息:

Python版本

Python 3.8.5 (default, Sep  3 2020, 21:29:08) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32

Pandas版本:1.1.3

平台:

>>> platform.platform()
'Windows-10-10.0.18362-SP0'
>>> platform.processor()
'Intel64 Family 6 Model 158 Stepping 10, GenuineIntel'
>>> platform.version()
'10.0.18362'

我明白这里发生了什么。来自 pandas documentation:

dtypeType name or dict of column -> type, optional Data type for data or columns. E.g. {‘a’: np.float64, ‘b’: np.int32, ‘c’: ‘Int64’} Use str or object together with suitable na_values settings to preserve and not interpret dtype. If converters are specified, they will be applied INSTEAD of dtype conversion.

因此,大写字母中提到,如果您指定一个,read_csv() 将使用 dtype 转换器。因此,传递 int 就像明确告诉它使用 int 的 numpy 等价物。这就是没有警告的原因,它应该被视为预期行为。


现在,问题是为什么我的 int 的 numpy 等价物是 int32 而不是 int64

numpy (doc) 将 python 的 int 映射到 built-in 标量 np.int_,并带有以下警告:

numpy documentation 指定 built-in 标量 np.int_ 依赖于平台:

TL;DR int(python) -> int_(numpy) -> long(C)

所以,问题是 long 对您的系统意味着什么?

对于 MSC,long 是 4 个字节,如 docs:

并由 numpy 确认:

对于 GCC,long 是 8 个字节,如此处确认:


希望这对您有用,并且您学到了新东西。