比较两列,如果发现相等则替换为“无”

时间:2019-01-21 06:50:39

标签: pandas

以下命令会将匹配行的所有值替换为“无”。

ndf.iloc[np.where(ndf.path3=='sys_bck_20190101.tar.gz')] = np.nan

我真正需要做的是替换与path3列匹配的名为path4的单个列的值。这不起作用:

ndf.iloc[np.where(ndf.path3==ndf.path4), ndf.path3] = np.nan

更新:

有一个可用于axis ='columns'的熊猫方法“ fillna”。 有没有类似的方法可以将“ NA”值写入重复的列?

我可以做到,但是它看起来不像pythonic。

ndf.loc[ndf.path1==ndf.path2, 'path1'] = np.nan
ndf.loc[ndf.path2==ndf.path3, 'path2'] = np.nan
ndf.loc[ndf.path3==ndf.path4, 'path3'] = np.nan
ndf.loc[ndf.path4==ndf.filename, 'path4'] = np.nan

更新2

让我解释一下这个问题:

假设此数据框:

ndf = pd.DataFrame({

         'path1':[4,5,4,5,5,4],
         'path2':[4,5,4,5,5,4],
         'path3':list('abcdef'),
         'path4':list('aaabef'),
        'col':list('aaabef')
})

预期结果:

0   NaN 4.0 NaN NaN a
1   NaN 5.0 b   NaN a
2   NaN 4.0 c   NaN a
3   NaN 5.0 d   NaN b
4   NaN 5.0 NaN NaN e
5   NaN 4.0 NaN NaN f

如您所见,这与fillna相反。而且我想在熊猫中没有简单的方法可以做到这一点。我已经提到了我可以使用的命令。我想知道是否有更好的方法来实现这一目标。

1 个答案:

答案 0 :(得分:1)

使用:

for c1, c2 in zip(ndf.columns, ndf.columns[1:]):
    ndf.loc[ndf[c1]==ndf[c2], c1] = np.nan

print (ndf)
   path1  path2 path3 path4 col
0    NaN    4.0   NaN   NaN   a
1    NaN    5.0     b   NaN   a
2    NaN    4.0     c   NaN   a
3    NaN    5.0     d   NaN   b
4    NaN    5.0   NaN   NaN   e
5    NaN    4.0   NaN   NaN   f