在具有特定条件的pandas中删除行

时间:2016-06-17 22:45:57

标签: python pandas

我有一个ID列表和一个数据帧,其中一列是ID。我想删除数据框中的所有行,其中ID不是ID列表中的ID之一。这是我使用的代码:

df = df.drop(df[df.ID not in list_IDs].index)

但我收到此错误消息:

  

ValueError:系列的真值是不明确的。使用a.empty,   a.bool(),a.item(),a.any()或a.all()。

我做错了什么?

3 个答案:

答案 0 :(得分:0)

试试这个:

df.ix[~df.ID.isin(list_IDs)]

<强>解释

df.ID not in list_IDs这样的构造即使在vanilla Python中也不会起作用:

In [12]: [1,2,3] in [1,2,3]
Out[12]: False

In [13]: [1,2] in [1,2,3]
Out[13]: False

在pandas中你想使用.isin()功能

数据:

In [14]: list_IDs
Out[14]: [24, 12, 42, 44]

In [15]: df
Out[15]:
   ID   A
0  58  69
1  36  63
2  92  43
3  24  37
4  12  54
5  42   0
6  44  57
7  78  59
8  59  85
9  56  84

演示

In [16]: df.ID.isin(list_IDs)
Out[16]:
0    False
1    False
2    False
3     True
4     True
5     True
6     True
7    False
8    False
9    False
Name: ID, dtype: bool

In [17]: df[df.ID.isin(list_IDs)]
Out[17]:
   ID   A
3  24  37
4  12  54
5  42   0
6  44  57

否定 isin()

In [18]: df[~df.ID.isin(list_IDs)]
Out[18]:
   ID   A
0  58  69
1  36  63
2  92  43
7  78  59
8  59  85
9  56  84

In [19]: ~df.ID.isin(list_IDs)
Out[19]:
0     True
1     True
2     True
3    False
4    False
5    False
6    False
7     True
8     True
9     True
Name: ID, dtype: bool

答案 1 :(得分:0)

Evaluating pandas series values with logical expressions and if-statements查看unutbu的答案。基本上,如果您尝试通过将数组与列表进行比较来尝试评估TRUE / FALSE,则pandas总是会引发错误,因为如果系列中的所有值都匹配,则用户是否期望返回TRUE,如果系统中的多个值匹配则返回TRUE系列赛。因此,必须使用.allarray < 5等特定功能。

补充:为什么array == [5,6]会起作用?这是因为没有歧义。数组中的所有值都按元素比较为5.如果是True则不清楚是否需要FalseTrue。它等于第一个元素,但不是第二个元素。在某些情况下,您需要False,而在其他情况下,您需要.any。为避免歧义,用户需要使用{{1}}等特定功能。

答案 2 :(得分:0)

import pandas as pd
x = pd.Series([1,2,3])

现在,想想你希望python如何评估这个

(x in [1,2])

或更直接

pd.Series([1,2,3]) in [1,2]

如你所见

  

“ValueError:系列的真值是不明确的”

你要做的是这个

x.isin([1,2])