根据正则表达式过滤数据帧

Ame*_*ina 5 python regex pandas

假设我有一个my_df带有列的数据框'brand',我想放弃品牌所在的任何行toyota或者bmw.

我认为以下会这样做:

my_regex = re.compile('^(bmw$|toyota$).*$')
my_function = lambda x: my_regex.match(x.lower())
my_df[~df['brand'].apply(my_function)] 
Run Code Online (Sandbox Code Playgroud)

但我得到错误:

ValueError: cannot index with vector containing NA / NaN values
Run Code Online (Sandbox Code Playgroud)

为什么?如何使用正则表达式过滤我的DataFrame?

beh*_*uri 8

我想re.match返回None时,有没有比赛,并打破索引; 下面是使用pandas 矢量化字符串方法的替代解决方案; 请注意,pandas字符串方法可以处理空值:

>>> df = pd.DataFrame( {'brand':['BMW', 'FORD', np.nan, None, 'TOYOTA', 'AUDI']})
>>> df
    brand
0     BMW
1    FORD
2     NaN
3    None
4  TOYOTA
5    AUDI

[6 rows x 1 columns]

>>> idx = df.brand.str.contains('^bmw$|^toyota$', 
             flags=re.IGNORECASE, regex=True, na=False)
>>> idx
0     True
1    False
2    False
3    False
4     True
5    False
Name: brand, dtype: bool

>>> df[~idx]
  brand
1  FORD
2   NaN
3  None
5  AUDI

[4 rows x 1 columns]
Run Code Online (Sandbox Code Playgroud)