我想将相同的功能应用于两个数据框。两者都具有相同的第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'])
答案 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])