2015-09-16 53 views
2

我會感謝您的幫助。我有一個熊貓數據框。我想使用正則表達式搜索數據框的3列,然後返回符合搜索條件的所有行,並按照我的一列進行排序。我想寫這個函數作爲一個函數,所以如果可能的話,我可以用其他標準來實現這個邏輯,但是我不太清楚如何做到這一點。使用正則表達式搜索並過濾熊貓數據框

例如,我知道怎麼拉的搜索正是如此的結果(COL1是列名):

idx1 = df.col1.str.contains(r'vhigh|high', flags=re.IGNORECASE, regex=True, na=False) 

print df[~idx1] 

,但我無法弄清楚如何採取此類行動,並執行它與多列,然後排序。任何人有任何提示?

+1

如何做你上面顯示,但迭代每列。然後將結果索引作爲集合存儲;最後你可以找到最終所需行的交集。 – Constantino

回答

2

您可以使用apply使代碼更加簡潔。例如,假設該數據幀:

df = pd.DataFrame({'col1': ['vhigh', 'low', 'vlow'], 'col2': ['eee', 'low', 'high'], 'val': [100,200,300]}) 
print df 

輸入:

col1 col2 val 
0 vhigh eee 100 
1 low low 200 
2 vlow high 300 

您可以選擇所有包含字符串vhighcol1highcol2如下行:

mask = df[['col1', 'col2']].apply(lambda x: x.str.contains('vhigh|high', regex=True)).any(axis=1) 
print df[mask] 

apply函數在每列應用contains函數(因爲通過defau lt axis=0)。函數any返回一個布爾掩碼,其中元素True表示至少有一列符合搜索條件。這可以用來在原始DataFrame上執行選擇。

輸出:

col1 col2 val 
0 vhigh eee 100 
2 vlow high 300 

然後,向由列,例如對結果進行分類val列,你可以簡單地做:

df[mask].sort('val') 
+0

這正是我正在尋找的。我對lambda函數不是很熟悉,所以這非常有用。你可以指點一些能解釋最後一個命令語法的東西:'df [mask]'我不熟悉括號的使用。 – Daina

+1

括號的特殊用法稱爲[布爾索引](http://pandas.pydata.org/pandas-docs/stable/indexing.html#boolean-indexing)。同一頁面包含有關索引和選擇數據的其他方式的信息,值得一讀。 –