Pandas Dataframe:如何通过应用函数更新多列?

Joh*_*ith 6 python pandas

我有一个像这样的Dataframe df:

   A   B   C    D
2  1   O   s    h
4  2   P    
7  3   Q
9  4   R   h    m
Run Code Online (Sandbox Code Playgroud)

我有一个函数f可以基于B连​​续计算C和D:

def f(p): #p is the value of column B for a row. 
     return p+'k', p+'n'
Run Code Online (Sandbox Code Playgroud)

如何通过将函数f应用于数据框来填充第4&7行的缺失值?

预期结果如下:

   A   B   C    D
2  1   O   s    h
4  2   P   Pk   Pn
7  3   Q   Qk   Qn
9  4   R   h    m
Run Code Online (Sandbox Code Playgroud)

由于实际函数非常复杂,因此必须使用函数f。此外,该功能仅需要应用于缺少C和D的行

Col*_*vel 8

如果你想使用你的函数为这样的,这里是一个班轮:

df.update(df.B.apply(lambda x: pd.Series(dict(zip(['C','D'],f(x))))), overwrite=False)

In [350]: df
Out[350]:
   A  B   C   D
2  1  O   s   h
4  2  P  Pk  Pn
7  3  Q  Qk  Qn
9  4  R   h   m
Run Code Online (Sandbox Code Playgroud)

你也可以这样做:

df1 = df.copy()

df[['C','D']] = df.apply(lambda x: pd.Series([x['B'] + 'k', x['B'] + 'n']), axis=1)

df1.update(df, overwrite=False)
Run Code Online (Sandbox Code Playgroud)


Fab*_*nna 7

也许有一种更优雅的方法,但是我会这样:

df['C'] = df['B'].apply(lambda x: f(x)[0])
df['D'] = df['B'].apply(lambda x: f(x)[1])
Run Code Online (Sandbox Code Playgroud)

将函数应用于列,并获得输出的第一个和第二个值。它返回:

   A  B   C   D
0  1  O  Ok  On
1  2  P  Pk  Pn
2  3  Q  Qk  Qn
3  4  R  Rk  Rn
Run Code Online (Sandbox Code Playgroud)

编辑:

以更简洁的方式,感谢此答案

df[['C','D']] = df['B'].apply(lambda x: pd.Series([f(x)[0],f(x)[1]]))
Run Code Online (Sandbox Code Playgroud)


小智 5

如果桌子不是那么大,我有一个更简单的方法来做到这一点。

def f(row): #row is the value of row. 
    if row['C']=='':
        row['C']=row['B']+'k'
    if row['D']=='':
        row['D']=row['B']+'n'
    return row
df=df.apply(f,axis=1)
Run Code Online (Sandbox Code Playgroud)