pandas numpy过滤器对可空值不起作用

0dxa2lsx  于 2023-06-20  发布在  其他
关注(0)|答案(1)|浏览(143)

我有这些代码片段

deal['incash_potential'] = np.where(
    np.vectorize(lambda x, y: x != None and y != None)(deal.present_value, deal.fee),
    np.vectorize(lambda x, y: np.dot(x, y))(deal.fee, deal.present_value),
    None
)

Deal is a pandas Dataframe
在deal.fee列中,我有一些可空值(python None),但当a运行此代码时,它会向我提出:

np.vectorize(lambda x, y: np.dot(x, y))(deal.fee, deal.present_value),
                          ^^^^^^^^^^^^
File "<__array_function__ internals>", line 200, in dot
  TypeError: unsupported operand type(s) for *: 'float' and 'NoneType'

列deal.present_value没有可空值,它们都是浮点型
为什么NP.过滤器不工作?

ajsxfq5m

ajsxfq5m1#

当使用np.where(cond, a, b)时,它将首先计算ab,然后根据条件选择返回哪个值。这对你来说意味着numpy试图计算 * 整个 * 数据集的np.dot(x,y)(本质上是deal.present_valuedeal.fee的元素乘积之和),但它不能,因为这需要将float乘以None
我想你想把deal.present_valuedeal.fee的乘积(你只有两个数字,所以点积是不必要的)都不是None,如果它们中的任何一个是None,就把None
不使用np.where,您可以使用列表解析,并在满足条件时获取产品。

import numpy as np

rng = np.random.default_rng(42)
a = rng.random(10).tolist()
b = rng.random(10).tolist()

a[5] = None
b[2] = None

c = [_a*_b if _a is not None and _b is not None else None for _a, _b in zip(a, b)]
print(c)

输出:

[0.2869813736474069, 0.4067371723227025, None, 0.5737676446323813, 0.04175957326128496, None, 0.4221164995176159, 0.05016446708421002, 0.10603083595948919, 0.284492762833831]

相关问题