2015-01-15 176 views
39

過濾包含字符串模式行假設我們有在Python大熊貓的數據幀,看起來像這樣:如何從大熊貓數據幀

df = pd.DataFrame({'vals': [1, 2, 3, 4], 'ids': [u'aball', u'bball', u'cnut', u'fball']}) 

或者,以表格的形式:

ids vals 
aball 1 
bball 2 
cnut 3 
fball 4 

如何過濾包含關鍵詞「球?」的行嗎?例如,輸出應該是:

ids vals 
aball 1 
bball 2 
fball 4 
+2

您應該接受已發佈的5個答案中的一個,在投票按鈕下方會出現一個勾號標記,請注意,'str.contains'答案可能是您的要求中最快和推薦的方法:http:/ /pandas.pydata.org/pandas-docs/stable/generated/pandas.core.strings.StringMethods.contains.html#pandas.core.strings.StringMethods.contains – EdChum

回答

83
In [3]: df[df['ids'].str.contains("ball")] 
Out[3]: 
    ids vals 
0 aball  1 
1 bball  2 
3 fball  4 
+0

嗨艾米特,非常感謝,完美的作品! –

+0

@JohnKnight - 不客氣! – Amit

+1

如何反轉此查找所有不包含字符串的行? – user4896331

7
>>> mask = df['ids'].str.contains('ball')  
>>> mask 
0  True 
1  True 
2 False 
3  True 
Name: ids, dtype: bool 

>>> df[mask] 
    ids vals 
0 aball  1 
1 bball  2 
3 fball  4 
31
df[df['ids'].str.contains('ball', na = False)] # valid for (at least) pandas version 0.17.1 

步驟一步解釋(從內到外):

  • df['ids']選擇的所述ids柱數據幀(技術上,對象df[ids]pandas.Series的類型)
  • df['ids'].str允許我們應用矢量化的字符串方法(例如,lowercontains)到系列
  • df['ids'].str.contains('ball')檢查每個Series元素作爲該元素的值是否具有字符串「球」作爲子字符串。結果是一系列布爾值指示TrueFalse關於「球」子串的存在。
  • df[df['ids'].str.contains('ball')]將布爾'mask'應用於數據框並返回包含適當記錄的視圖。
  • na = False從考慮中刪除NA/NaN值;否則可能會返回一個ValueError。
+0

您能解釋一下代碼在做什麼以及它是如何工作的嗎? – Kevin

+0

如何使用部分匹配並使用部分匹配「#」來獲取剩餘的字符串:str'就像這樣? –

+2

當有人做了一步一步的解釋時,絕對喜歡它。這真的有助於理解! – user4896331

1

如果您想將您篩選的列設置爲新索引,那麼您也可以考慮使用.filter;如果你想保持它作爲一個單獨的列,然後str.contains是要走的路。

比方說,你有

df = pd.DataFrame({'vals': [1, 2, 3, 4, 5], 'ids': [u'aball', u'bball', u'cnut', u'fball', 'ballxyz']}) 

     ids vals 
0 aball  1 
1 bball  2 
2  cnut  3 
3 fball  4 
4 ballxyz  5 

,你的計劃是過濾器,其中ids包含ball並設置ids新索引的所有行,你可以做

df.set_index('ids').filter(like='ball', axis=0) 

這給

  vals 
ids   
aball  1 
bball  2 
fball  4 
ballxyz  5 

但是filter還允許您傳遞正則表達式,因此您還可以僅篩選列條目以ball結尾的那些行。在這種情況下,你使用現在,因爲它與ball開始,不與它到底是不是包含ballxyz進入

df.set_index('ids').filter(regex='ball$', axis=0) 

     vals 
ids   
aball  1 
bball  2 
fball  4 

注意。

如果你想獲得與ball開始的所有條目,你可以簡單的使用

df.set_index('ids').filter(regex='^ball', axis=0) 

產生

  vals 
ids   
ballxyz  5 

同一作品的列;所有你需要改變的是axis=0部分。如果你根據列進行過濾,那將是axis=1