Pandas - 根据第一列值删除行

时间:2017-08-17 18:55:35

标签: python pandas dataframe

所以这个链接(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)]

我的DataFrame的第一列,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 个答案:

答案 0 :(得分: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