【问题标题】: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]*')

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

【问题讨论】:

标签: python regex 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 提供了非常丰富的信息,我不知道过滤器专门用于索引。
      • 温的回答是正确的做法。我会推荐那个,但很高兴您发现所有答案都有帮助:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-04
      • 1970-01-01
      • 2017-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多