【问题标题】:Query dataframe index based on float value根据浮点值查询数据帧索引
【发布时间】:2018-04-19 00:17:57
【问题描述】:

假设我有一个这样的数据框:

     a  b  c  d  e
index                                             
0       -202     -236      135     -178     -186
8       -139     -102      112     -100     -112
10       -77      -33       89      -22      -37
18       -16       35       62       46       26
20        45       67       36      114       90

而且我知道我可以使用 df= df.iloc[0:2] 之类的东西来提取前 3 行数据。我的问题是:我可以根据索引值而不是索引位置来查询索引吗?

例如,提取 index=8,18 的值而不使用 df= df.iloc[1, 3]。

【问题讨论】:

    标签: python pandas dataframe indexing


    【解决方案1】:

    与get_level_values

    df[df.index.get_level_values(0)<=10]
    Out[654]: 
             a    b    c    d    e
    index                         
    0     -202 -236  135 -178 -186
    8     -139 -102  112 -100 -112
    10     -77  -33   89  -22  -37
    

    如果按值选择,则为loc

    df.loc[[8,10],:]
    Out[695]: 
             a    b    c    d    e
    index                         
    8     -139 -102  112 -100 -112
    10     -77  -33   89  -22  -37
    

    【讨论】:

      【解决方案2】:

      是的!使用query

      df.query('index <= 10')
      
               a    b    c    d    e
      index                         
      0     -202 -236  135 -178 -186
      8     -139 -102  112 -100 -112
      10     -77  -33   89  -22  -37
      

      如果索引没有名字,可以使用ilevel_0

      df.index.name = None
      
      df.query('ilevel_0 <= 10')
      
            a    b    c    d    e
      0  -202 -236  135 -178 -186
      8  -139 -102  112 -100 -112
      10  -77  -33   89  -22  -37
      

      回复评论

      df.query('index in [8, 18]')
      
               a    b    c    d    e
      index                         
      8     -139 -102  112 -100 -112
      18     -16   35   62   46   26
      

      【讨论】:

      • 感谢您的建议。但我需要df.query('index == 8, 18') 之类的东西,但这是行不通的。
      【解决方案3】:

      您可以使用pandas.Index.isin按索引过滤:

      res = df[df.index.isin([8, 18])]
      
      print(res)
      
      #          a    b    c    d    e
      # index                         
      # 8     -139 -102  112 -100 -112
      # 18     -16   35   62   46   26
      

      或者对于一个范围:

      res = df.loc[(df.index >= 0) & (df.index <= 10)]
      
      print(res)
      
      #          a    b    c    d    e
      # index                         
      # 0     -202 -236  135 -178 -186
      # 8     -139 -102  112 -100 -112
      # 10     -77  -33   89  -22  -37
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-09
        • 1970-01-01
        • 1970-01-01
        • 2021-01-11
        • 2020-05-26
        • 2019-08-12
        • 2020-03-13
        • 1970-01-01
        相关资源
        最近更新 更多