代码之家  ›  专栏  ›  技术社区  ›  SankMa

熊猫类比较

  •  3
  • SankMa  · 技术社区  · 6 年前

    我在这里创建了一个示例数据框。

    df = pd.DataFrame( np.random.randn(10,2), columns=list('AB'))    
    
              A         B
    0  0.459759         0.152645
    
    1  0.183613         0.756527
    
    2 -1.836027         0.032433
    
    3  0.264336         0.170171
    
    4 -0.276347         0.208389
    
    5  0.677709         0.725274
    
    6 -0.547858         0.376683
    
    7 -0.994759        -0.750373
    
    8  0.556593         1.282167
    
    9 -1.444533         0.589768
    
    df['A_rank']= pd.qcut(df['A'],[0,0.25,0.5,0.75,1],duplicates="drop")
    
              A         B                A_rank
    0  0.459759        0.152645         (0.411, 0.678]
    
    1  0.183613        0.756527         (-0.0464, 0.411]
    
    2 -1.836027        0.032433         (-1.837, -0.883]
    
    3  0.264336        0.170171         (-0.0464, 0.411]
    
    4 -0.276347        0.208389         (-0.883, -0.0464]
    
    5  0.677709        0.725274         (0.411, 0.678]
    
    6 -0.547858        0.376683        (-0.883, -0.0464]
    
    7 -0.994759        -0.750373       (-1.837, -0.883]
    
    8  0.556593        1.282167        (0.411, 0.678]
    
    9 -1.444533         0.589768       (-1.837, -0.883]
    

    我想从上面创建一个新的数据帧,如下所示,它基本上是基于a\U排名的子集。

              A         B             A_rank  A_rank_open_low    A_rank_closed_hi
    0  0.459759        0.152645         (0.411, 0.678]           0.411               0.678
    
    5  0.677709        0.725274          (0.411, 0.678]          0.411               0.678
    
    8  0.556593         1.282167         (0.411, 0.678]            0.411               0.678
    

    我不想使用qcut使用整数标签,但希望直接使用qcut输出本身的标签,但我无法与作为范围的类别(a\u rank)进行比较。由于我不了解此数据类型,以下尝试失败。

    df2 = df[df['A_rank']=="(0.411, 0.678]"]
    

    无错误,但输出为:

    Empty DataFrame    
    Columns: [A, B, A_rank]    
    Index: []
    
    df2 = df[df['A_rank']== pd.Categorical("(0.411, 0.678]")]
    

    TypeError:只有“类别”相同时,才能比较类别。类别长度不同

    df2 = df[str(df['A_rank'])=="(0.411, 0.678]"] 
    

    也进行了追踪

    我在文档中搜索了分类索引和类别,但没有找到多少。请帮帮我。

    2 回复  |  直到 6 年前
        1
  •  6
  •   jezrael    6 年前

    使用 Interval :

    df2 = df[df['A_rank']== pd.Interval(0.411, 0.678)]
    
        2
  •  4
  •   MaxU - stand with Ukraine    6 年前

    @耶斯雷尔向你展示了如何正确地做到这一点。我想向您展示如何“调查”类似案件。

    首先检查列数据类型:

    In [8]: df.dtypes
    Out[8]:
    A          float64
    B          float64
    A_rank    category
    dtype: object
    

    然后是单元格类型:

    In [9]: df.iat[0, 2]
    Out[9]: Interval(0.0809, 0.539, closed='right')
    
    In [10]: type(df.iat[0, 2])
    Out[10]: pandas._libs.interval.Interval