sql case when语句的替代方法

sql case when语句的替代方法,sql,if-statement,pandas,case-when,Sql,If Statement,Pandas,Case When,我是熊猫队的新手,从sql开始。 我有一个问题,我试图用pandas替换sql case-when语句 在高层,我有一个输入数据框和一个参考表。我根据ref.表创建计算列 例子 输入数据 ------------+-----------+----+------------+-----+------+ | 参考数据 ---------+---------+---------+ | REF_COL | REF_VAL | REF_SCR | +---------+---------+--------

我是熊猫队的新手,从sql开始。 我有一个问题,我试图用pandas替换sql case-when语句 在高层,我有一个输入数据框和一个参考表。我根据ref.表创建计算列 例子 输入数据 ------------+-----------+----+------------+-----+------+ |

参考数据

---------+---------+---------+
| REF_COL | REF_VAL | REF_SCR |
+---------+---------+---------+
| C1      | A       |      10 |
| C1      | B       |      20 |
| C1      | C       |      30 |
| C1      | NULL    |       0 |
| C1      | MISSING |       0 |
| C1      | A       |      20 |
| C1      | B       |      30 |
| C1      | C       |      40 |
| C1      | NULL    |      10 |
| C1      | MISSING |      10 |
| C2      | <1000   |       0 |
| C2      | >1000   |      20 |
| C2      | >7000   |      30 |
| C2      | >9500   |      40 |
| C2      | MISSING |       0 |
| C2      | NULL    |       0 |
| C3      | <3%     |       5 |
| C3      | >3%     |      10 |
| C3      | >5%     |     100 |
| C3      | >7%     |     200 |
| C3      | >10%    |     300 |
| C3      | NULL    |       0 |
| C3      | MISSING |       0 |
| C4      | <5000   |      10 |
| C4      | >5000   |      20 |
| C4      | >10000  |      30 |
| C4      | >15000  |      40 |
+---------+---------+---------+
传统的SQL方式是

select student_id, 
UG_MAJOR, 
C1,
case 
when UG_MAJOR ='MATH' AND when C1 IS NULL THEN 0
when UG_MAJOR ='MATH' AND when C1 ='MISSING' THEN 0
when UG_MAJOR ='MATH' AND when C1 ='A' THEN 10
when UG_MAJOR ='MATH' AND when C1 ='B' THEN 20
when UG_MAJOR ='MATH' AND when C1 ='C' THEN 30

when UG_MAJOR ='ALL_OTHER' AND when C1 IS NULL THEN 0
when UG_MAJOR ='ALL_OTHER' AND when C1 ='MISSING' THEN 0
when UG_MAJOR ='ALL_OTHER' AND when C1 ='A' THEN 20
when UG_MAJOR ='ALL_OTHER' AND when C1 ='B' THEN 30
when UG_MAJOR ='ALL_OTHER' AND when C1 ='C' THEN 40

ELSE 'TBD' END AS C1_SCR,

C2,
CASE 
WHEN C2 IS NULL THEN 0
WHEN C2 ='Missing' OR C2 = . THEN 0
WHEN C2<=1000 THEN 0
WHEN C2 >1000 AND C2<=7000 THEN 20
WHEN C2 >7000 AND C2<=9500 THEN 30
WHEN C2 >9500 THEN 40
ELSE 'TBD' 
END AS C2_SCR

FROM REF_INPUT
GROUP BY 1,2,3,4,5,6
选择学生id,
大学专业,
C1,
案例
当UG_MAJOR='MATH'和C1为空时,则为0
当UG_MAJOR='MATH'和C1='MISSING'时,则为0
当UG_主修数学时,当C1='A'时,则为10
当UG_主修数学时,当C1='B'时,则为20
当UG_主修数学时,当C1='C'时,则为30
当UG_MAJOR='ALL_OTHER'和C1为空时,则为0
当UG_MAJOR='ALL_OTHER'和C1='MISSING'时,则为0
当UG_MAJOR='ALL'u OTHER'和C1='A'时,则为20
当UG_MAJOR='ALL'u OTHER'和C1='B'时,则为30
当UG_MAJOR='ALL'u OTHER'和C1='C'时,则为40
否则“待定”结束为C1\U SCR,
C2,
案例
当C2为空时,则为0
当C2=”缺失”或C2=”时。然后0
当C21000、C27000和C29500时,则为40
否则“待定”
结束为C2_SCR
从REF_输入
按1,2,3,4,5,6分组
我想知道是否有一个优雅的方式来处理熊猫? 谢谢
Par

正如上面几条评论中提到的,我在创建此解决方案时做了一些假设,因为没有提供一些东西,但我尝试返回请求的df,即使它不优雅

dfc = df.copy()
dfc['c1_scr'] = 'TBD'
dfc = dfc.loc[((dfc.ug_major=='MATH')&(dfc.c1.isnull()))
              |((dfc.ug_major=='MATH')&(dfc.c1=='Missing'))
              |((dfc.ug_major=='ALL_OTHER')&(dfc.c1=='Missing'))
              |((dfc.ug_major=='MATH')&(dfc.c1.isnull())),
              'c1_scr'] = 0
dfc = dfc.loc[((dfc.ug_major=='MATH')&(dfc.c1=='A')),'c1_scr'] = 10
dfc = dfc.loc[((dfc.ug_major=='MATH')&(dfc.c1=='B'))
              |((dfc.ug_major=='ALL_OTHER')&(dfc.c1=='A'))
              ,'c1_scr'] = 20
dfc = dfc.loc[((dfc.ug_major=='MATH')&(dfc.c1=='C'))
              |((dfc.ug_major=='ALL_OTHER')&(dfc.c1=='A'))
              ,'c1_scr'] = 30
dfc = dfc.loc[((dfc.ug_major=='ALL_OTHER')&(dfc.c1=='C')),'c1_scr'] = 40
dfc['c2_scr'] = 'TBD'
dfc = dfc.loc[(dfc.c2.isnull())
              |(dfc.c2=='MISSING')
              |(dfc.c2=='.')
              |(dfc.c2<=1000)
              ,'c2_scr'] = 0
dfc = dfc.loc[(dfc.c2>1000)
              &(dfc.c2<=7000)
              ,'c2_scr'] = 20
dfc = dfc.loc[(dfc.c2>7000)
              &(dfc.c2<=9500)
              ,'c2_scr'] = 30
dfc = dfc.loc[(dfc.c2>9500),'c2_scr'] = 40
dfc = dfc[['student_id','ug_major','c1','c1_scr'
           ,'c2','c2_scr']
         ].groupby(['student_id','ug_major','c1','c1_scr','c2','c2_scr'])
print(dfc.head())
dfc=df.copy()
dfc['c1_scr']=“待定”
dfc=dfc.loc[((dfc.ug_major=='MATH')&(dfc.c1.isnull())
|((dfc.ug_major=='MATH')和(dfc.c1=='Missing'))
|((dfc.ug_major=='ALL_OTHER')和(dfc.c1=='Missing'))
|((dfc.ug_major=='MATH')&(dfc.c1.isnull()),
“c1_scr”]=0
dfc=dfc.loc[((dfc.ug_major='MATH')和(dfc.c1='A'),'c1_scr']=10
dfc=dfc.loc[((dfc.ug_专业=='MATH')和(dfc.c1='B'))
|((dfc.ug_major=='ALL_OTHER')和(dfc.c1=='A'))
,'c1_scr']=20
dfc=dfc.loc[(dfc.ug_专业=='MATH')和(dfc.c1='C'))
|((dfc.ug_major=='ALL_OTHER')和(dfc.c1=='A'))
,'c1_scr']=30
dfc=dfc.loc[((dfc.ug_major=='ALL_OTHER')和(dfc.c1='C'),'c1_scr']=40
dfc['c2_scr']=“待定”
dfc=dfc.loc[(dfc.c2.isnull())
|(dfc.c2==“缺失”)
|(dfc.c2=='。)
|(dfc.c21000)
&(dfc.c27000)
&(dfc.c29500),'c2_scr']=40
dfc=dfc[‘学生id’、‘大学专业’、‘c1’、‘c1’scr'
,'c2','c2_scr']
].groupby(['student_id'、'ug_major'、'c1'、'c1_scr'、'c2'、'c2_scr']))
打印(dfc.head())

您能在pyton中发布您在这方面的努力吗?还有完整的sql代码?嗨,我编辑了sql。我不知道从哪里开始使用PythonPandas(比如要使用什么函数/类),但是你已经有了pandas中的数据了吗?然后请展示(一些创建数据帧的代码)
select student_id, 
UG_MAJOR, 
C1,
case 
when UG_MAJOR ='MATH' AND when C1 IS NULL THEN 0
when UG_MAJOR ='MATH' AND when C1 ='MISSING' THEN 0
when UG_MAJOR ='MATH' AND when C1 ='A' THEN 10
when UG_MAJOR ='MATH' AND when C1 ='B' THEN 20
when UG_MAJOR ='MATH' AND when C1 ='C' THEN 30

when UG_MAJOR ='ALL_OTHER' AND when C1 IS NULL THEN 0
when UG_MAJOR ='ALL_OTHER' AND when C1 ='MISSING' THEN 0
when UG_MAJOR ='ALL_OTHER' AND when C1 ='A' THEN 20
when UG_MAJOR ='ALL_OTHER' AND when C1 ='B' THEN 30
when UG_MAJOR ='ALL_OTHER' AND when C1 ='C' THEN 40

ELSE 'TBD' END AS C1_SCR,

C2,
CASE 
WHEN C2 IS NULL THEN 0
WHEN C2 ='Missing' OR C2 = . THEN 0
WHEN C2<=1000 THEN 0
WHEN C2 >1000 AND C2<=7000 THEN 20
WHEN C2 >7000 AND C2<=9500 THEN 30
WHEN C2 >9500 THEN 40
ELSE 'TBD' 
END AS C2_SCR

FROM REF_INPUT
GROUP BY 1,2,3,4,5,6
dfc = df.copy()
dfc['c1_scr'] = 'TBD'
dfc = dfc.loc[((dfc.ug_major=='MATH')&(dfc.c1.isnull()))
              |((dfc.ug_major=='MATH')&(dfc.c1=='Missing'))
              |((dfc.ug_major=='ALL_OTHER')&(dfc.c1=='Missing'))
              |((dfc.ug_major=='MATH')&(dfc.c1.isnull())),
              'c1_scr'] = 0
dfc = dfc.loc[((dfc.ug_major=='MATH')&(dfc.c1=='A')),'c1_scr'] = 10
dfc = dfc.loc[((dfc.ug_major=='MATH')&(dfc.c1=='B'))
              |((dfc.ug_major=='ALL_OTHER')&(dfc.c1=='A'))
              ,'c1_scr'] = 20
dfc = dfc.loc[((dfc.ug_major=='MATH')&(dfc.c1=='C'))
              |((dfc.ug_major=='ALL_OTHER')&(dfc.c1=='A'))
              ,'c1_scr'] = 30
dfc = dfc.loc[((dfc.ug_major=='ALL_OTHER')&(dfc.c1=='C')),'c1_scr'] = 40
dfc['c2_scr'] = 'TBD'
dfc = dfc.loc[(dfc.c2.isnull())
              |(dfc.c2=='MISSING')
              |(dfc.c2=='.')
              |(dfc.c2<=1000)
              ,'c2_scr'] = 0
dfc = dfc.loc[(dfc.c2>1000)
              &(dfc.c2<=7000)
              ,'c2_scr'] = 20
dfc = dfc.loc[(dfc.c2>7000)
              &(dfc.c2<=9500)
              ,'c2_scr'] = 30
dfc = dfc.loc[(dfc.c2>9500),'c2_scr'] = 40
dfc = dfc[['student_id','ug_major','c1','c1_scr'
           ,'c2','c2_scr']
         ].groupby(['student_id','ug_major','c1','c1_scr','c2','c2_scr'])
print(dfc.head())