python - np.where 数据框列 .isin 数据框列
问题描述
我有一个数据框:
TEL1 TEL2 TEL3 NAME
0 10 12 11 Ben
1 18 18 14 Ben
2 19 12 15 Ben
3 10 17 21 Ben
4 19 19 23 Ben
5 12 18 15 Ben
6 15 13 19 Ben
我的 python 代码的目的是删除存在于 TEL1 与 TEL2、TEL2 与 TEL3、TEL3 与 TEL1 中任何位置的数字。在所有三列之间应该有唯一的数字。
我用来在 TEL1 和 TEL2、TEL2 和 TEL3 之间进行重复数据删除,并且它正在工作。:
df['TEL1'] = np.where(df['TEL1'].isin(df['TEL2']), '', df['TEL1'])
df['TEL2'] = np.where(df['TEL2'].isin(df['TEL3']), '', df['TEL2'])
结果:
TEL1 TEL2 TEL3 NAME
0 10 12 11 Ben
1 18 14 Ben
2 12 15 Ben
3 10 17 21 Ben
4 23 Ben
5 18 15 Ben
6 15 13 19 Ben
但是,当我添加以下代码时,它不起作用并显示与上面相同的输出:
df['TEL3'] = np.where(df['TEL3'].isin(df['TEL1']), '', df['TEL3'])
预期的结果是这样的(删除了 TEL3 列中的 15):
TEL1 TEL2 TEL3 NAME
0 10 12 11 Ben
1 18 14 Ben
2 12 Ben
3 10 17 21 Ben
4 23 Ben
5 18 15 Ben
6 15 13 19 Ben
这可能不是尝试实现我所追求的最有效的方式,但我了解代码试图做什么。如果有更有效的方法将不胜感激。谢谢!
解决方案
IIUC 这应该可以解决您的整个问题。一个数字在整个帧中只能出现一次。
df.set_index('NAME', append=True).stack().drop_duplicates().unstack(2).reset_index(level=1)
输出:
NAME TEL1 TEL2 TEL3
0 Ben 10.0 12.0 11.0
1 Ben 18.0 NaN 14.0
2 Ben 19.0 NaN 15.0
3 Ben NaN 17.0 21.0
4 Ben NaN NaN 23.0
6 Ben NaN 13.0 NaN
推荐阅读
- flutter - 对象列表中的飞镖颤动最大值
- python - TemplateDoesNotExist only happen on prod ec2 but Templates works on local
- angular - Angular 7 CLI can not find runtime.js and the rest of .js files
- swift - 创建一个@State var 区域,即基于两个@State var 宽度,一个@State var 高度
- oracle - Oracle PL/SQL SELECT INTO 子句认为它需要另一个 INTO
- javascript - 如何将数据从动态表存储到数据库
- selenium-webdriver - Selenium Web driver Issue
- python-3.x - 如何使用 Python 通过另一个字符串列表对字符串列表进行分组?
- bash - Shell 逐行读取文件,但在每一行之后都显示未找到。我错过了什么?
- python - 拆分:将 NumPy 格式转换为 pandas