Python pandas dataframe 将函数结果应用于 NaN 的多个列

Python pandas dataframe apply result of function to multiple columns where NaN

我有一个包含三列的数据框和一个函数,该函数在给定 x 列值的情况下计算 y 列和 z 列的值。我只需要计算缺少 NaN 的值。

def calculate(x):
    return 1, 2

df = pd.DataFrame({'x':['a', 'b', 'c', 'd', 'e', 'f'], 'y':[np.NaN, np.NaN, np.NaN, 'a1', 'b2', 'c3'], 'z':[np.NaN, np.NaN, np.NaN, 'a2', 'b1', 'c4']})

 x    y    z
0  a  NaN  NaN
1  b  NaN  NaN
2  c  NaN  NaN
3  d   a1   a2
4  e   b2   b1
5  f   c3   c4

mask = (df.isnull().any(axis=1))

df[['y', 'z']] = df[mask].apply(calculate, axis=1, result_type='expand')

然而,我得到了以下结果,尽管我只应用于屏蔽集。不确定我做错了什么。

    x   y   z
0   a   1.0 2.0
1   b   1.0 2.0
2   c   1.0 2.0
3   d   NaN NaN
4   e   NaN NaN
5   f   NaN NaN

如果掩码是倒置的,我会得到以下结果:

df[['y', 'z']] = df[~mask].apply(calculate, axis=1, result_type='expand')
    x   y   z
0   a   NaN NaN
1   b   NaN NaN
2   c   NaN NaN
3   d   1.0 2.0
4   e   1.0 2.0
5   f   1.0 2.0

预期结果:

   x    y    z
0  a  1.0   2.0
1  b  1.0   2.0
2  c  1.0   2.0
3  d   a1   a2
4  e   b2   b1
5  f   c3   c4

你可以在计算完整的数据帧后填写na set_axis

out = (df.fillna(df.apply(calculate, axis=1, result_type='expand')
                       .set_axis(['y','z'],inplace=False,axis=1)))

print(out)

   x   y   z
0  a   1   2
1  b   1   2
2  c   1   2
3  d  a1  a2
4  e  b2  b1
5  f  c3  c4

尝试:

df.loc[mask,["y","z"]] = pd.DataFrame(df.loc[mask].apply(calculate, axis=1).to_list(), index=df[mask].index, columns = ["y","z"])

print(df)

        x   y   z
    0   a   1   2
    1   b   1   2
    2   c   1   2
    3   d   a1  a2
    4   e   b2  b1
    5   f   c3  c4