pandas - 比较 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 相反。而且我想在熊猫中没有简单的方法可以做到这一点。我已经提到了我可以使用的命令。我想知道是否有更好的方法来实现这一点。
解决方案
利用:
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
推荐阅读
- android - 在 Room 生成的类上发布构建失败:javax.annotation 不存在
- css - 在图像上放置项目
- ios - 获取用户从服务器到订阅 ios 的服务器通知
- android - 找不到已安装的 Gradle 版本
- angular - 纯/文本的 Angular 8/httpclient 错误响应,无法解析响应
- javascript - Javascript:使用 ES6 类中的对象作为成员和静态对象
- php - 如何使用 mysqli 和 SSL 将 PHP 连接到 MySQL
- javascript - 将 div 值放在 php 变量中
- c - Linux C Ncurses 问题
- asp.net-mvc - 从 Azure AD 模拟到 Azure B2C