我有一个具有int8
列的数据帧,以确保较低的内存。
In [1]: df = pd.DataFrame({'a': [100, 50]}, dtype='int8')
df
Out[1]:
a
0 100
1 50
In [2]: df.dtypes
Out[2]: a int8
dtype: object
sum
自动将结果提升到int64
,并给出正确的结果。
In [3]: df.sum()
Out[3]:
a 150
dtype: int64
但+
或*
操作不这样做。
In [4]: df.loc[0, 'a'] + df.loc[1, 'a']
C:UsersbubaiAppDataLocalTempipykernel_331641219674856.py:1: RuntimeWarning: overflow encountered in byte_scalars
df.loc[0, 'a'] + df.loc[1, 'a']
Out[4]: -106
In [5]: df['a'] * 4
Out[5]: 0 -112
1 -56
Name: a, dtype: int8
所以在一个地方,pandas
决定自动上转换结果,而在其他情况下,它不。这是一个不一致的pandas
或非标准编码在我的结束?如果我的代码中有这样的算术运算,我怎样才能避免错误的结果呢?
numpy也在这样做:
np.array([100, 50], dtype=np.int8).sum()
输出:150
如果必须有int8类型,则执行显式转换:
df.sum().astype(np.int8)
输出:
a -106
dtype: int8