删除所有满足正则表达式条件的行

Posted

技术标签:

【中文标题】删除所有满足正则表达式条件的行【英文标题】:Remove all rows that meet regex condition 【发布时间】:2019-02-13 05:56:38 【问题描述】:

尝试自学 pandas.. 并使用不同的 dtypes

我有一个df如下

df = pd.DataFrame('ID':[0,2,"bike","cake"], 'Course':['Test','Math','Store','History'] )
print(df)
    ID  Course
0   0   Test
1   2   Math
2   bike    Store
3   cake    History

ID的dtype当然是一个对象。如果 ID 中有字符串,我想要做的是删除 DF 中的所有行。

我认为这会像..一样简单。

df.ID.filter(regex='[\w]*')

但这会返回所有内容,是否有可靠的方法来处理此类事情?

【问题讨论】:

相关/可能重复:Remove rows where column value type is string Pandas 【参考方案1】:

您可以使用to_numeric

df[pd.to_numeric(df.ID,errors='coerce').notnull()]
Out[450]: 
  Course ID
0   Test  0
1   Math  2

【讨论】:

【参考方案2】:

另一种选择是将列转换为字符串并使用str.match

print(df[df['ID'].astype(str).str.match("\d+")])
#  Course ID
#0   Test  0
#1   Math  2

您的代码不起作用,因为如pandas.DataFrame.filter 的文档中所述:

请注意,此例程不会根据其内容过滤数据框。过滤器应用于索引的标签。

【讨论】:

【参考方案3】:

Wen's answer 是解决此问题的正确(也是最快)方法,但要解释为什么您的正则表达式不起作用,您必须了解 \w 的含义。

\w 匹配任何单词字符,包括[a-zA-Z0-9_]。所以你当前匹配的 includes 数字,所以一切都匹配。一个有效的正则表达式方法是:

df.loc[df.ID.astype(str).str.match(r'\d+')]

  ID Course
0  0   Test
1  2   Math

第二个问题是您对filter 的使用。它不是过滤您的 ID 行,而是过滤您的索引。使用filter 的有效解决方案如下:

df.set_index('ID').filter(regex=r'^\d+$', axis=0)

   Course
ID
0    Test
2    Math

【讨论】:

谢谢!所有解决方案都对我有用,我不确定哪个要绿色勾号..?你会推荐我的好先生什么? /w 提供了非常丰富的信息,我不知道过滤器专门用于索引。 温的回答是正确的做法。我会推荐那个,但很高兴您发现所有答案都有帮助:)

以上是关于删除所有满足正则表达式条件的行的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式:删除包含“帮助”等的行

Qt正则表达式 如何得到字符串中所有满足条件的字符。这个正则为啥匹配不成功

如何通过熊猫过滤满足正则表达式的行

java正则表达式,怎么匹配空白行

从 BigTable 中删除与 BigTable 中的正则表达式匹配的行

正则表达式