np.vectorize返回错误的舍入结果

时间:2018-12-18 14:04:44

标签: python pandas numpy

我想将相同的功能应用于两个数据框。两者都具有相同的第1行,但具有不同的第0行。我认为在每个数据帧的第1行中,结果(D)应该相同。有什么想法为什么会有所不同吗?

df1 = pd.DataFrame({'A' : [1, 1],
                    'B' : [1, 1]})

df2 = pd.DataFrame({'A' : [1, 1],
                    'B' : [float('nan'), 1]})

C = 0.2

def fun (A, B):
    if math.isnan(B):
        return 1
    else:
        return A + C / B

df1['D'] = np.vectorize(fun)(df1['A'], df1['B'])
df2['D'] = np.vectorize(fun)(df2['A'], df2['B'])

DF

1 个答案:

答案 0 :(得分:2)

您应尽可能进行矢量化处理。例如,最好的方法是使用

df2.A + .2 * df2.B

0    NaN
1    1.2
dtype: float64

或者更好,

np.where(df2.B.isna(), 1, df2.A + .2 * df2.B)
array([1. , 1.2])

假定这是更复杂功能的替代者,其原因是由于dtype不匹配问题...返回值被截断为int。尝试将otypes=[float]参数传递给vectorize以指定返回类型float

f = np.vectorize(fun, otypes=[float])
f(df2['A'], df2['B'])
array([1. , 1.2])

f(df1['A'], df1['B'])
array([1.2, 1.2])
相关问题