删除所有满足正则表达式条件的行
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正则表达式 如何得到字符串中所有满足条件的字符。这个正则为啥匹配不成功