2017-08-17 104 views
1

所以這個鏈接(Deleting DataFrame row in Pandas based on column value)介紹瞭如何做一個很簡單的列刪除基於存在的值...熊貓 - 刪除行基於第一列值

...這條線將刪除行的地方列line_race包含值0

df = df[df.line_race != 0] 

我的問題是在深度多一點不過。

我想刪除我的DataFrame中第一列中的值不是某個值的所有行。具體而言,如果第一列fish_frame[0]包含的字符串與另一個列表stocks中的值不匹配,則將其刪除。

我覺得這樣的事情會做的伎倆,但事實並非如此:

fish_frame = fish_frame[fish_frame[0] == (any s in fish_frame[0] for s in stocks)] 

我的數據幀中的第一列,fish_frame[0]

0  NEFS X Available stocks 
1      11/6/2013 
2      Chris King 
3   Package $4000 or BO 
4   GOM Winter Flounder 
5      HAD GBW 
6      POLLOCK 
7     WINTER FL SNE 
8      COD GBW 
9      WHITEHAKE 
10      HAD GBE 
11    WINTER FL GBbb 
12      Grey Sole 
13    YELLOWTAIL SNE 
14     YELLOWTAIL GB 
15      REDFISH 
16       NaN 
17      List A 
18   Package $10,000 or BO 
19   GOM Winter Flounder 

而我的列表stocks

(
     'GB COD EAST', 
     'GB COD EAST ACE', 
     'GB COD WEST ACE', 
     'GBE COD', 
     'GB COD WEST', 
     'GBW COD', 
     'GOM COD', 
     'GB HADDOCK EAST', 
     'GBE HADDOCK', 
     'GBW HADDOCK', 
     'GBE HADD', 
     'GB HADDOCK WEST', 
     'GBYT', 
     'GB YT', 
     'GBW HADD', 
     'GOM HADDOCK', 
     'GOM HADD', 
     'GOM HAD', 
     'GOM HADOCK', 
     'PLAICE', 
     'DABS', 
     'POLLOCK', 
     'POLL', 
     'REDFISH', 
     'REDS', 
     'RED', 
     'WHITE HAKE' , 
     'WHITEHAKE', 
     'WHAKE', 
     'WHAK', 
     'GB WINTER FLOUNDER', 
     'GB WINTER FL', 
     'GB BB', 
     'GB WINTER', 
     'GB BLACK BACKS', 
     'GB BLACKBACKS', 
     'GOM WINTER FLOUNDER', 
     'WINTER GOM FLOUNDER', 
     'GOM BLACKBACKS', 
     'GOM BB', 
     'GOM WINTER', 
     'SNE WINTER FLOUNDER', 
     'SNE WINTER', 
     'SNE/MA WINTER FLOUNDER', 
     'SNE/MA YELLOWTAIL', 
     'SNE BLACKBACK', 
     'SNE BLACKBACKS', 
     'SNE BB', 
     'WITCH FLOUNDER', 
     'WITCH FL', 
     'WITCH', 
     'WHICH', 
     'WHITCH', 
     'GREYSOLE', 
     'GREY SOLE', 
     'CC/GOM YELLOWTAIL FLOUNDER', 
     'GOM YELLOWTAIL', 
     'GOM YELLOW TAIL', 
     'GOM YT', 
     'GB YELLOWTAIL FLOUNDER', 
     'GB YELLOWTAIL', 
     'GB YT', 
     'SNE/MA YELLOWTAIL FLOUNDER', 
     'SNE YT', 
     'SNE YELLOWTAIL', 
     'SNE YELLOW TAIL', 
     'SCALLOP IFQ' 
     ) 

任何幫助解決這個將不勝感激,謝謝。

回答

1

你想從stocks對象構造一個正則表達式模式。然後使用pd.Series.str.contains來測試是否匹配。最後,使用布爾索引來刪除那些沒有匹配的索引。

df[df[0].astype(str).str.contains('|'.join(stocks))] 

6  POLLOCK 
9  WHITEHAKE 
15  REDFISH 
Name: 0, dtype: object 
+0

Ohhh ok gotcha。這解決了我的問題,謝謝一堆。它也不幸造成了另一個問題(我要解決),因爲現在我必須將所有可能的魚拼寫變體添加到我的列表中。但再次感謝您的幫助。 – theprowler

+0

原諒我對理解正則表達式的理解不是很好,但是如果我想在那裏添加一個'.IGNORECASE'命令,我會在哪裏放? – theprowler

+1

這不是正則表達式,它是熊貓。首先用'import re'導入正則表達式模塊。然後像''df [df [0] .astype(str).str.contains('|'.join(stocks),flags = re.IGNORECASE)那樣在'str.contatins'中使用're.IGNORECASE'] ' – piRSquared