分享
三行代码  ›  专栏  ›  技术社区  ›  pankaj

大熊猫条件下如何对分类变量进行逻辑比较

  •  4
  • pankaj  · 技术社区  · 4 天前

    我有下面这样的数据框。它有分类列(带),其层次结构从0、G1、G2、G3到G4,其中G4是最高的。

    CASE
             WHEN Band = '00' THEN access.Y
             WHEN Band = 'G1' THEN acess.X +200
             WHEN Band >= 'G2' THEN acess.X +access.Y
    
           END  As Result
           From access
    

    数据帧

    Band    X   Y     Result
    00     200  2100    2100
    G1     300  2300    500
    G2     200  5000    5200
    G3     150  6000    6150
    00     250  2500    2500
    G1     400  6000    600
    G2     300  6000    6300
    G4     500  4500    5000
    

    在python中如何实现这一点?

    2 回复  |  直到 4 天前
        1
  •  1
  •   anky_91    4 天前

    你需要 pd.Categorical 这里( )能够使用比较运算符,如 >= 在分类序列中,然后使用 np.select 供使用 if,elif,else

    df['Band'] = pd.Categorical(df['Band'],categories=['00','G1','G2','G3','G4'],ordered=True)
    
    df['result']=np.select([df['Band']=='00',df['Band']=='G1',df['Band']>='G1']
                           ,[df['Y'],df['X']+200,df['X'].add(df['Y'])])
    print(df)
    

      Band    X     Y  Result  result
    0   00  200  2100    2100    2100
    1   G1  300  2300    2600     500
    2   G2  200  5000    5200    5200
    3   G3  150  6000    6150    6150
    4   00  250  2500    2500    2500
    5   G1  400  6000    6400     600
    6   G2  300  6000    6300    6300
    7   G4  500  4500    5000    5000
    

    细节: 如果我们现在打印这个系列,我们就能看到hirearchy:

    print(df['Band'])
    
    0    00
    1    G1
    2    G2
    3    G3
    4    00
    5    G1
    6    G2
    7    G4
    Name: Band, dtype: category
    Categories (5, object): [00 < G1 < G2 < G3 < G4]
    
        2
  •  1
  •   jezrael    4 天前

    使用 numpy.select :

    df['res'] = (np.select([df['Band']=='00', df['Band'] == 'G1'],
                           [df['Y'], df['X'] + 200],
                            df['X'] + df['Y']))
    print (df)
      Band    X     Y  Result   res
    0   00  200  2100    2100  2100
    1   G1  300  2300    2600   500
    2   G2  200  5000    5200  5200
    3   G3  150  6000    6150  6150
    4   00  250  2500    2500  2500
    5   G1  400  6000    6400   600
    6   G2  300  6000    6300  6300
    7   G4  500  4500    5000  5000
    

    如果有的话 G

    df['res'] = (np.select([df['Band']=='00', df['Band'] == 'G1', df['Band']>='G1'],
                           [df['Y'], df['X'] + 200, df['X'] + df['Y']]))
    print (df)
      Band    X     Y  Result   res
    0   00  200  2100    2100  2100
    1   G1  300  2300    2600   500
    2   G2  200  5000    5200  5200
    3   G3  150  6000    6150  6150
    4   00  250  2500    2500  2500
    5   G1  400  6000    6400   600
    6   G2  300  6000    6300  6300
    7   G4  500  4500    5000  5000