首页 > 解决方案 > 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

这可能不是尝试实现我所追求的最有效的方式,但我了解代码试图做什么。如果有更有效的方法将不胜感激。谢谢!

标签: pythonpandas

解决方案


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

推荐阅读