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

Dat*_*ice 5 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
Run Code Online (Sandbox Code Playgroud)

ID的dtype当然是一个对象。我想做的是,如果ID中包含字符串,则删除DF中的任何行。

我以为这很简单。

df.ID.filter(regex='[\w]*')
Run Code Online (Sandbox Code Playgroud)

但这返回了一切,是否有确定的处理此类问题的方法?

WeN*_*Ben 5

您可以使用 to_numeric

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


pau*_*ult 5

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

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

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

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


use*_*203 5

Wen 的答案是解决这个问题的正确(也是最快)的方法,但是要解释为什么您的正则表达式不起作用,您必须了解是什么\w意思。

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

df.loc[df.ID.astype(str).str.match(r'\d+')]
Run Code Online (Sandbox Code Playgroud)

  ID Course
0  0   Test
1  2   Math
Run Code Online (Sandbox Code Playgroud)

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

df.set_index('ID').filter(regex=r'^\d+$', axis=0)
Run Code Online (Sandbox Code Playgroud)

   Course
ID
0    Test
2    Math
Run Code Online (Sandbox Code Playgroud)

  • 文的回答是正确的做法。我推荐那个,但很高兴你发现所有的答案都有帮助:) (2认同)