Python 如果另一列是NaN,如何替换该列中的值?

Python 如果另一列是NaN,如何替换该列中的值?,python,pandas,Python,Pandas,所以这应该是地球上最简单的事情。伪代码: Replace column C with NaN if column E is NaN 我知道我可以通过拉出列E为NaN的所有数据帧行,替换所有列C,然后在原始数据集上合并这些数据帧行来实现这一点,但对于一个简单的操作来说,这似乎需要大量的工作。为什么这不起作用: 样本数据: dfz = pd.DataFrame({'A' : [1,0,0,1,0,0], 'B' : [1,0,0,1,0,1],

所以这应该是地球上最简单的事情。伪代码:

Replace column C with NaN if column E is NaN
我知道我可以通过拉出列E为NaN的所有数据帧行,替换所有列C,然后在原始数据集上合并这些数据帧行来实现这一点,但对于一个简单的操作来说,这似乎需要大量的工作。为什么这不起作用:

样本数据:

dfz = pd.DataFrame({'A' : [1,0,0,1,0,0],
               'B' : [1,0,0,1,0,1],
               'C' : [1,0,0,1,3,1],
               'D' : [1,0,0,1,0,0],
               'E' : [22.0,15.0,None,10.,None,557.0]})
替换功能:

def NaNfunc(dfz):
  if dfz['E'] == None:
    return None
  else:
    return dfz['C']

dfz['C'] = dfz.apply(NaNfunc, axis=1)

如何在一行中做到这一点?

使用
np.where

In [34]:
dfz['C'] = np.where(dfz['E'].isnull(), dfz['E'], dfz['C'])
dfz

Out[34]:
   A  B   C  D    E
0  1  1   1  1   22
1  0  0   0  0   15
2  0  0 NaN  0  NaN
3  1  1   1  1   10
4  0  0 NaN  0  NaN
5  0  1   1  0  557
或者简单地屏蔽df:

In [38]:
dfz.loc[dfz['E'].isnull(), 'C'] = dfz['E']
dfz

Out[38]:
   A  B   C  D    E
0  1  1   1  1   22
1  0  0   0  0   15
2  0  0 NaN  0  NaN
3  1  1   1  1   10
4  0  0 NaN  0  NaN
5  0  1   1  0  557

您的解决方案对我来说很有效,但将func参数命名为与df相同有点混乱,最好将其命名为
row
x
,以避免歧义