代码之家  ›  专栏  ›  技术社区  ›  Georg Heiler

pandas按分位数过滤结果为空集

  •  1
  • Georg Heiler  · 技术社区  · 6 年前

    你怎么能 pandas.Series 分位数被分位数箱过滤?我的三种不同方法要么彻底失败,要么导致一个空集。

    理想的解决方案将使用 df.query()

    df = pd.DataFrame({'my_series':[1,2,3,4,5,6,7]})
    df['quantile'] = pd.qcut(df.my_series, [0,0.5,0.6,1])
    print(df)
    #df[df.quantile == '(4.6, 7.0]'] # fails with key error :false
    
    df['string_quantiles'] = df['quantile'].astype(object)
    print(df)
    display(df[df['string_quantiles'] == '(4.6, 7.0]']) # no failure, but empty set
    
    df.query("my_series == '(0.999, 4.0]'") # empty set
    
    1 回复  |  直到 6 年前
        1
  •  5
  •   BENY    6 年前

    添加 astype 转换它

    yourdf=df[df['string_quantiles'].astype(str)=='(4.6, 7.0]'].copy()
    Out[60]: 
       my_series    quantile string_quantiles
    4          5  (4.6, 7.0]       (4.6, 7.0]
    5          6  (4.6, 7.0]       (4.6, 7.0]
    6          7  (4.6, 7.0]       (4.6, 7.0]
    

    df[df['quantile'].map(lambda x : x.left)==4.6].copy()
    
        2
  •  4
  •   cs95 abhishek58g    6 年前

    pd.cut 返回 Interval 物体。所以,只需创建一个并比较:

    df[df['quantile'] == pd.Interval(4.6, 7)]
    
       my_series    quantile
    4          5  (4.6, 7.0]
    5          6  (4.6, 7.0]
    6          7  (4.6, 7.0]
    
        3
  •  4
  •   piRSquared    6 年前

    你可以使用 codes 属性 Categorical

    df[df['quantile'].cat.codes == 2]
    
       my_series    quantile
    4          5  (4.6, 7.0]
    5          6  (4.6, 7.0]
    6          7  (4.6, 7.0]
    

    知道吗

    df['quantile'].cat.categories[2]
    
    Interval(4.6, 7.0, closed='right')