【问题标题】:regex expression for strings that start the same but end with number to subset pandas dataframe以数字开头的字符串的正则表达式表达式到子集熊猫数据帧
【发布时间】:2021-08-18 08:50:18
【问题描述】:

可能是一个基本的问题,但是,假设我有一个看起来像这样的数据框:

string_lst = ["bar0001", "bar0002", "bar0003", "bar0003", "bar0004", "bar0004", "bar0005", "bar0006"]
a = pd.DataFrame({'foo': string_lst,
             'test':[0,1,2,3,4,5,6,7]})

如何对数据框进行子集化,以便从 3:6 获得所有“条形图”?

我猜的大概是:

a['foo'== regex 3:6]?

我的想法是选择string_lst 的最后 n 个数字,但真正的数据框会有不同数量的数字,例如 bar2005bar20005,所以我不知道如何继续。

非常感谢!

【问题讨论】:

    标签: regex pandas dataframe subset


    【解决方案1】:

    您的正则表达式字符串可以是:“bar[0-9]*” 这将允许:bar1、bar01、bar000000000001 但不允许 bar 1 和 bar001a

    【讨论】:

    • 但我想选择一个特定的范围,例如 bar003:bar006,其中包括 bar004 和 bar005。你也可以发布一个适用于这个特定df的例子吗?谢谢!
    【解决方案2】:

    IIUC,

    a[a['foo'].str.contains('bar0+[3-6]', regex=True)]
    

    输出:

           foo  test
    2  bar0003     2
    3  bar0003     3
    4  bar0004     4
    5  bar0004     5
    6  bar0005     6
    7  bar0006     7
    

    【讨论】:

      【解决方案3】:

      如果您的数据集具有相同的模式(条形后跟数字),您可以执行以下操作。这将处理“bar004”、“bar00004”等情况。

      a.loc[a.foo.str.extract('(\d+)')[0].astype(float).between(3,6)]
      

      【讨论】:

      • 这很有效,即使前导零有不同的数字,这正是我所寻找的。谢谢!
      【解决方案4】:

      你需要什么?

      1.选择索引3到6?

      a.loc[3:6,:]
      
      
             foo  test
      3  bar0003     3
      4  bar0004     4
      5  bar0004     5
      6  bar0005     6
      
      
      
          
      

      选择 3 到 6 号柱?

      a['s']=a['foo'].str.extract('(\d$)').astype(int)
      a[a.s.ge(3)&a.s.le(6)].drop('s',1)
      
            foo    test
      2  bar0003     2
      3  bar0003     3
      4  bar0004     4
      5  bar0004     5
      6  bar0005     6
      7  bar0006     7
      

      【讨论】:

        猜你喜欢
        • 2011-09-16
        • 1970-01-01
        • 2021-11-04
        • 1970-01-01
        • 2018-08-28
        • 2014-10-28
        • 2018-09-24
        • 2017-07-24
        • 2016-07-12
        相关资源
        最近更新 更多