如果在 Pandas 的任一列中找到,则删除两个 float64 值

Posted

技术标签:

【中文标题】如果在 Pandas 的任一列中找到,则删除两个 float64 值【英文标题】:Remove both float64 values if found in either columns Pandas 【发布时间】:2018-10-24 10:39:08 【问题描述】:

如果发现非唯一值,我会尝试删除所有行,例如:

    N1  N2
1   2   4
2   4   5
3   6   6
4   8   7
5   10  8
6   12  10
7   NaN 12
8   NaN 14

所以在这种情况下,我想要的值是 2 5 7 和 14。另外一列比另一列长,因此必须忽略 NaN。我基本上想找到重复值并从 N1 和 N2 中删除。这是我尝试过的:

df[~df.N1.isin(['N2'])]

出现了一些错误。感谢您的帮助。

凯文

【问题讨论】:

【参考方案1】:

快速解决方案:

>> df.stack().drop_duplicates(keep=False).unstack()

    N1    N2
1  2.0   NaN
2  NaN   5.0
4  NaN   7.0
8  NaN  14.0

作为一个列表:

>> df.stack().drop_duplicates(keep=False).values.tolist()

[2.0, 5.0, 7.0, 14.0]

【讨论】:

【参考方案2】:

这是如何实现的:

from io import StringIO
import pandas as pd

s = '''N1 N2
2 4
4 5
6 6
8 7
10 8
12 10
NaN 12
NaN 14'''

ss = StringIO(s)


df = pd.read_csv(ss, sep=r'\s+')

df = df.dropna()

df[~df.N1.isin(['N2'])]

输出:

【讨论】:

【参考方案3】:

根据您发布的值创建一个数据框:

import numpy as np
import pandas as pd

df = pd.DataFrame('N1':[2, 4, 6, 8, 10, 12, np.nan, np.nan], 
                   'N2':[4,5,6,7,8,10,12,14])

找出共同的价值观:

common = list(set(df['N1']) & set(df['N2']))

排除N1N2 具有其中之一的所有行:

df[(~df["N1"].isin(common)) | (~df["N2"].isin(common))]

更新

common = set(df['N1']) & set(df['N2'])
result = list(set(df['N2'])-common) + list(set(df['N1'])-common)
result = [x for x in result if x==x]

【讨论】:

忘记 NaN 位我要做的就是从 N1 和 N2 中找到唯一值,然后将它们全部删除 示例的答案是一个包含 2 5 7 和 14 的列表 为什么不也是 8 个?

以上是关于如果在 Pandas 的任一列中找到,则删除两个 float64 值的主要内容,如果未能解决你的问题,请参考以下文章

如果前五列中的 NaN 则删除行

如果列值在一定范围内彼此接近,则删除 pandas 行

SQL 从 2 列中选择数据,如果它不为 NULL,则插入到视图中

如何取消透视多个列并从任一列中排除值?

如果 ID 存在于其他数据框中,则 Python Pandas 数据框在新列中添加“1”

pandas:如果满足 3 列中的条件,则更新值