基于正则表达式过滤数据框
Posted
技术标签:
【中文标题】基于正则表达式过滤数据框【英文标题】:Filtering a dataframe based on a regex 【发布时间】:2014-04-12 22:56:48 【问题描述】:假设我有一个数据框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)]
但我得到了错误:
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]
【讨论】:
以上是关于基于正则表达式过滤数据框的主要内容,如果未能解决你的问题,请参考以下文章