2016-01-16 26 views
1

爲了幫助說明我想在這裏實現的是一個數據幀稱爲df字符串:熊貓:高效子集數據幀基於含有特定的值

column1 column2 
1  foo faa 
2  bar car 
3  dog dog 
4  cat rat 
5  foo foo 
6  bar cat 
7  bird rat 
8  cat dog 
9  bird foo 
10  bar car 

我想子集數據框 - 的條件是行被丟棄如果column2中的字符串包含多個值中的一個。

這是一個單值很容易,在這種情況下「富」:

df = df[~df['column2'].str.contains("foo")]

但是,讓我們說,我想放棄在這列2字符串包含「貓」或「所有行富」。應用於上面的df,這將會減少5行。

什麼是最有效,最pythonic的方式來做到這一點?這可以是一個函數的形式,也可以是多個布爾或其他我沒有想到的東西。

isin不起作用,因爲它需要精確匹配。

N.B:我編輯了這個問題,因爲我第一次犯了一個錯誤。道歉。

+0

下次考慮發佈一個新問題,因爲th原來的問題被@EdChum的答案很好的修復了。 –

+0

我已經從你和@EdChum那裏獲得了一些有價值的經驗教訓。我不會再犯同樣的錯誤。謝謝。 – RDJ

回答

3

您可以使用一個邏輯掩蔽爲:

df = df[(~df['column2'].str.contains("foo")) & (~df['column2'].str.contains("bird")) & (~df['column2'].str.contains("cat"))] 

返回:

column1 column2 
1  2  bar 
2  3  dog 
5  6  bar 
9  10  bar 
3

使用isin來測試值列表的成員資格和否定~布爾面膜:

In [3]: 
vals = ['bird','cat','foo'] 

df[~df['column2'].isin(vals)] 
Out[3]: 
    column1 column2 
1  2  bar 
2  3  dog 
5  6  bar 
9  10  bar 

In [4]: 
df['column2'].isin(vals) 

Out[4]: 
0  True 
1 False 
2 False 
3  True 
4  True 
5 False 
6  True 
7  True 
8  True 
9 False 
Name: column2, dtype: bool 
+0

我對最初的問題犯了一個錯誤。你的回答是正確的,但後來才知道'isin'需要完全匹配。我編輯了這個問題,以反映我需要能夠選擇包含特定值而不是精確匹配的字符串。我認爲這幾乎肯定需要以某種方式使用'str.contains()'。抱歉。 – RDJ

+1

當人們發佈的問題沒有詳細描述他們想要的內容時,真的很煩人,在這種情況下,法比奧的答案就是你想要的,將來你需要說明你確切的要求,併發布代表性數據和期望的產出。將問題改爲*這是我真正想要的*令人難以置信的煩人和浪費人們的時間,在某些情況下,可能會更好地發佈另一個問題 – EdChum

+0

非常抱歉,我煩惱你,並浪費你的時間埃德。學習到教訓了。 – RDJ