基于正则表达式过滤数据框

Posted

技术标签:

【中文标题】基于正则表达式过滤数据框【英文标题】: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 暗示了一个领先的^,并且您不需要用.*$ 明确声明“不关心接下来会发生什么”。尽管有些事情告诉我,即使使用有效的正则表达式,上述内容也不起作用。 【参考方案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]

【讨论】:

以上是关于基于正则表达式过滤数据框的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Pyspark 中同一数据框中另一列的正则表达式值过滤数据框中的一列

如何在熊猫过滤器函数中反转正则表达式

基于正则表达式合并数据框中的变量对

如何根据正则表达式从 pd 系列或数据框中删除行?

在 OpenFileDialog 中过滤文件的正则表达式

正则表达式过滤日志