我注意到在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)]
相同的结果