【问题标题】:Python pandas dataframe apply result of function to multiple columns where NaNPython pandas 数据框将函数结果应用于 NaN 的多个列
【发布时间】:2021-05-02 23:27:44
【问题描述】:

我有一个包含三列的数据框和一个在给定 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

【问题讨论】:

  • @anky 试过了,已经不行了,编辑一下问题。

标签: python pandas dataframe pandas-apply


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    试试:

    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
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多