我正在使用 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,因为这可能会导致在其他机器上测试失败。
您的测试失败,因为数据转换和预期数据的类型略有不同,例如
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