簡體   English   中英

在具有特定條件的pandas中刪除行

[英]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]則不清楚是否需要TrueFalse 它等於第一個元素,但不是第二個元素。 在某些情況下,你會想要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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM