我有一个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()。
我做错了什么?
答案 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系列赛。因此,必须使用.all
和array < 5
等特定功能。
补充:为什么array == [5,6]
会起作用?这是因为没有歧义。数组中的所有值都按元素比较为5.如果是True
则不清楚是否需要False
或True
。它等于第一个元素,但不是第二个元素。在某些情况下,您需要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])