我有如下数据框。它具有分类列(带),该列具有从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中完成?
答案 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]