不同类型的熊猫系列元素,numpy ints,在列表理解期间



我注意到在numpy 1.18.4(而不是以前的numpy版本中(中,列表推导期间的元素类型与访问元素不同。 例如:

foo = pd.DataFrame(data={'a': np.array([1, 2, 3]), 'b': np.array([1, 0, 1])})
var = {type(x) == type(foo['a'][i]) for i, x in enumerate(foo['a'])}

我得到var = {False}.这是什么原因呢?为什么以前不是这样?


理想情况下,我想在除以零时避免 ZeroDivisionError,而是在执行以下操作时获得 numpy.int32 产生的通常"inf":

[0 if x == 0 and z == 0 else x / y for x, y, z in zip(foo['a'], foo['b'], c)]

c另一个 int32 数组。有没有办法在不将元素重新转换为列表理解中的 np.int32 的情况下做到这一点?

IIUC 你想要什么,你可以对foo的列使用to_numpy

foo = pd.DataFrame(data={'a':np.array([0,2,3]), 'b': np.array([1,0,1])})
c = np.array([0,1,1])
[0 if x == 0 and z == 0 else x / y 
for x, y, z in zip(foo['a'].to_numpy(), foo['b'].to_numpy(), c)]
# [0, inf, 3.0]

尽管它提高了这种RuntimeWarning: divide by zero encountered in long_scalars但它有效

另一种选择是在创建 foo 时指定 pandas 类型,如pd.Int32Dtype

foo = pd.DataFrame(data={'a':np.array([0,2,3]), 'b': np.array([1,0,1])}, 
dtype=pd.Int32Dtype())
# or if foo exsit already you use astype with 
# foo = foo.astype(pd.Int32Dtype())
c = np.array([0,1,1])
[0 if x == 0 and z == 0 else x / y for x, y, z in zip(foo['a'], foo['b'], c)]

相同的结果

最新更新