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

7

我正在尝试学习pandas,并且在尝试不同的数据类型。

我有一个如下的数据框:

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个回答

6
你可以使用to_numeric函数。
df[pd.to_numeric(df.ID,errors='coerce').notnull()]
Out[450]: 
  Course ID
0   Test  0
1   Math  2

5
另一种选择是将该列转换为字符串并使用 str.match:
print(df[df['ID'].astype(str).str.match("\d+")])
#  Course ID
#0   Test  0
#1   Math  2

你的代码无法运行,因为根据pandas.DataFrame.filter文档所述:

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


5

温恩的回答是解决这个问题的正确(且最快)方法,但要解释为什么你的正则表达式不起作用,你必须理解 \w 的含义。

\w 匹配任何单词字符,包括 [a-zA-Z0-9_]。因此,您当前匹配的内容 包括 数字,因此会匹配所有内容。一个有效的正则表达式方法应该是:

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非常有用,我不知道filter只能在索引上工作。 - Umar.H
2
温的回答是正确的方法。我建议使用那个,但很高兴你发现所有答案都有帮助 :) - user3483203

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接