熊猫条件出现时如何将逻辑比较应用于分类变量

时间:2020-01-15 06:20:57

标签: python python-3.x pandas dataframe

我有如下数据框。它具有分类列(带),该列具有从0,G1,G2,G3到G4的层次结构,其中G4最高。

我想用熊猫重写下面的SQL逻辑

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 个答案:

答案 0 :(得分:1)

使用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

答案 1 :(得分:1)

您需要在这里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

详细信息: 如果我们现在打印该系列,我们将能够看到租金结构:

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]