Pandas Series dtype=int 在 64 位 Python 环境下默认为 int32 而不是 int64

问题描述 投票:0回答:1

我正在使用 64 位版本的 Python(Python 3.10.13,由 Anaconda, Inc. 打包)的 Windows 系统上工作。当我运行 Python 时,标头表明它是 64 位环境:“Python 3.10.13 | packaged by Anaconda, Inc. | (main, Sep 11 2023, 13:24:38) [MSC v.1916 64 bit ( AMD64)] 在 win32 上”。我不知道为什么它显示 win32,因为我有一台 win64 机器

我通过各种方法验证了位数。 首先使用以下代码,它正确地表明我正在运行 64 位 Python 环境。:

import platform
import sys

assert platform.architecture()[0] == "64bit"
assert sys.maxsize > 2**32

接下来,我用

conda info
检查了我的 conda 版本,它给出了
platform : win-64

但是,当我使用 Pandas(版本 2.1.3)并使用 dtype=int 创建一个空 Series 时:

import pandas as pd

print(pd.Series([1,2,3], dtype=int).dtype)

它显示“int32”而不是“int64”。我预计它在 64 位环境中默认为 int64。如果我不指定 int,比如

print(pd.Series([1,2,3]).dtype)
它会打印'int64'。

为什么 Pandas 在我的 64 位 Python 环境中默认为 int32 而不是 int64,如何确保它默认为 int64?

我不想用 .astype("int64") 显式转换我的所有 DataFrame,因为这可能会导致在其他机器上测试失败。

python pandas 64-bit 32bit-64bit 32-bit
1个回答
0
投票

重申问题

您的测试失败,因为数据转换和预期数据的类型略有不同,例如

int32
int64
。像
assert_frame_equal(df1, df2, check_dtype='equiv')
这样的东西会很方便,但它不起作用,因为
pandas
在引擎盖下使用了
assert_attr_equal
的硬检查。

您不想使用

assert_frame_equal(df1, df2, check_dtype=False)
,因为它根本不检查数据类型,这很糟糕。

解决方法

我的解决方法是将具有等效类型的列转换为测试中的相同类型。

示例

import pandas as pd


a = pd.DataFrame({'Int': [1, 2, 3], 'Float': [0.57, 0.179, 0.213]})  # Automatic type casting
# Force 32-bit
b = a.copy()
b['Int'] = b['Int'].astype('int32')
b['Float'] = b['Float'].astype('float32')
# Force 64-bit
c = a.copy()
c['Int'] = c['Int'].astype('int64')
c['Float'] = c['Float'].astype('float64')
try:
    pd.testing.assert_frame_equal(b, c)
    print('Success')
except AssertionError as err:
    print(err)

给出:

Attributes of DataFrame.iloc[:, 0] (column name="Int") are different

Attribute "dtype" are different
[left]:  int32
[right]: int64

解决方法功能:

def assert_frame_equiv(left: pd.DataFrame, right: pd.DataFrame) -> None:
    """Convert equivalent data types to same before comparing."""
    # First, check that the columns are the same.
    pd.testing.assert_index_equal(left.columns, right.columns, check_order=False)
    # Knowing columns names are the same, cast the same data type if equivalent.
    for col_name in left.columns:
        lcol = left[col_name]
        rcol = right[col_name]
        if (
            (pd.api.types.is_integer_dtype(lcol) and pd.api.types.is_integer_dtype(rcol))
            or (pd.api.types.is_float_dtype(lcol) and pd.api.types.is_float_dtype(rcol))
        ):
            left[col_name] = lcol.astype(rcol.dtype)

    return pd.testing.assert_frame_equal(left, right, check_like=True)


try:
    assert_frame_equiv(b, c)
    print('Success')
except AssertionError as err:
    print(err)

这给出了:

Success
© www.soinside.com 2019 - 2024. All rights reserved.