以下命令会将匹配行的所有值替换为“无”。
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相反。而且我想在熊猫中没有简单的方法可以做到这一点。我已经提到了我可以使用的命令。我想知道是否有更好的方法来实现这一目标。
答案 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