首页 > 解决方案 > 比较 2 列,如果发现相等则替换为 None

问题描述

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

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

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

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

更新:

有一种可与axis = 'columns' 一起使用的pandas 方法“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 相反。而且我想在熊猫中没有简单的方法可以做到这一点。我已经提到了我可以使用的命令。我想知道是否有更好的方法来实现这一点。

标签: pandas

解决方案


利用:

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

推荐阅读