删除所有符合正则表达式条件的行

时间:2018-09-07 21:48:23

标签: python regex 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的类型当然是一个对象。我想做的是,如果ID中包含字符串,则删除DF中的所有行。

我认为这很简单。

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

但这会返回所有内容,是否有确定的处理此类问题的方法?

3 个答案:

答案 0 :(得分:4)

您可以使用to_numeric

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

答案 1 :(得分:4)

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

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

您的代码无效,因为文档pandas.DataFrame.filter中所述:

  

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

答案 2 :(得分:4)

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