[英]Dropping rows in pandas with a certain condition
我有一個ID列表和一個數據幀,其中一列是ID。 我想刪除數據框中的所有行,其中ID不是ID列表中的ID之一。 這是我使用的代碼:
df = df.drop(df[df.ID not in list_IDs].index)
但我收到此錯誤消息:
ValueError:Series的真值是不明確的。 使用a.empty,a.bool(),a.item(),a.any()或a.all()。
我究竟做錯了什么?
嘗試這個:
df.ix[~df.ID.isin(list_IDs)]
說明
不像df.ID not in 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
使用邏輯表達式和if語句查看來自評估pandas系列值的 unutbu的答案。 基本上,如果您嘗試通過將數組與列表進行比較來嘗試評估TRUE / FALSE,則pandas總是會引發錯誤,因為如果系列中的所有值都匹配,則用戶是否期望返回TRUE,如果系統中的多個值匹配則返回TRUE系列賽。 因此,如特定功能.any
和.all
必須被代替使用。
另外:為什么array < 5
工作呢? 這是因為沒有歧義。 數組中的所有值都按元素比較為5.如果是array == [5,6]
則不清楚是否需要True
或False
。 它等於第一個元素,但不是第二個元素。 在某些情況下,你會想要True
而在其他情況下,你會想要False
。 為避免歧義,用戶需要使用特定的功能,如.any
。
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])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.