【问题标题】:Filtering a dataframe based on a regex基于正则表达式过滤数据框
【发布时间】:2014-04-12 22:56:48
【问题描述】:

假设我有一个数据框my_df,其中有一列'brand',我想删除品牌为toyotabmw 的所有行。

我认为以下方法可以做到:

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

但我得到了错误:

ValueError: cannot index with vector containing NA / NaN values

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

【问题讨论】:

  • 您的正则表达式没有意义:'$' 太多。也许您只是在寻找(bmw|toyota)re.match 暗示了一个领先的^,并且您不需要用.*$ 明确声明“不关心接下来会发生什么”。尽管有些事情告诉我,即使使用有效的正则表达式,上述内容也不起作用。

标签: python regex pandas


【解决方案1】:

我认为re.match 在没有匹配的情况下会返回None,这会破坏索引;以下是使用 pandas vectorized string methods 的替代解决方案;请注意,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]

【讨论】:

    猜你喜欢
    • 2020-11-13
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    • 2020-03-21
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多