[英]How to shorten if statement code in Python
我有这个 Pandas DataFrame
我正在尝试使用下面的代码创建一个名为Needed的新列。 规则是:
在"KHOÁ NHÓM"的情况下,对于每 25 个giohoc ,需要= dauvao_overall + 0.5 。
在"KHOÁ KÈM"的情况下,对于每 20 个giohoc ,需要= dauvao_overall + 0.5 。
我的想法是将giohoc除以 25 表示“KHOÁ NHÓM”,将 giohoc 除以 20 表示“KHOÁ KÈM”。
如果结果 < 1,则需要= dauvao_overall。
如果结果 >=1 且 <2,则需要= dauvao_overall + 0.5。
如果结果 >=2 且 <3,则需要= dauvao_overall + 1。
一直到……需要= dauvao_overall + 7。
虽然我成功了,但我相信有一种更短更简洁的方法可以达到相同的结果。 请告诉我我可以做些什么来改进代码。 谢谢!
empty =[]
for index, row in didiem.iterrows():
# KHOÁ NHÓM
if row.group_kh_ten == "KHOÁ NHÓM" and row.giohoc/25 < 1:
empty.append(row.dauvao_overall)
elif row.group_kh_ten == "KHOÁ NHÓM" and row.giohoc/25 >= 1 and row.giohoc/25 <2:
empty.append(row.dauvao_overall + 0.5)
elif row.group_kh_ten == "KHOÁ NHÓM" and row.giohoc/25 >= 2 and row.giohoc/25 <3:
empty.append(row.dauvao_overall + 1)
elif row.group_kh_ten == "KHOÁ NHÓM" and row.giohoc/25 >= 3 and row.giohoc/25 <4:
empty.append(row.dauvao_overall + 1.5)
elif row.group_kh_ten == "KHOÁ NHÓM" and row.giohoc/25 >= 4 and row.giohoc/25 <5:
empty.append(row.dauvao_overall + 2)
elif row.group_kh_ten == "KHOÁ NHÓM" and row.giohoc/25 >= 5 and row.giohoc/25 <6:
empty.append(row.dauvao_overall + 2.5)
elif row.group_kh_ten == "KHOÁ NHÓM" and row.giohoc/25 >= 6 and row.giohoc/25 <7:
empty.append(row.dauvao_overall + 3)
elif row.group_kh_ten == "KHOÁ NHÓM" and row.giohoc/25 >= 7 and row.giohoc/25 <8:
empty.append(row.dauvao_overall + 3.5)
elif row.group_kh_ten == "KHOÁ NHÓM" and row.giohoc/25 >= 8 and row.giohoc/25 <9:
empty.append(row.dauvao_overall + 4.0)
elif row.group_kh_ten == "KHOÁ NHÓM" and row.giohoc/25 >= 9 and row.giohoc/25 <10:
empty.append(row.dauvao_overall + 4.5)
elif row.group_kh_ten == "KHOÁ NHÓM" and row.giohoc/25 >= 10 and row.giohoc/25 <11:
empty.append(row.dauvao_overall + 5)
elif row.group_kh_ten == "KHOÁ NHÓM" and row.giohoc/20 >= 14 and row.giohoc/20 <15:
empty.append(row.dauvao_overall + 7.0)
# KHOÁ KÈM
elif row.group_kh_ten == "KHOÁ KÈM" and row.giohoc/20 < 1:
empty.append(row.dauvao_overall)
elif row.group_kh_ten == "KHOÁ KÈM" and row.giohoc/20 >= 1 and row.giohoc/20 <2:
empty.append(row.dauvao_overall + 0.5)
elif row.group_kh_ten == "KHOÁ KÈM" and row.giohoc/20 >= 2 and row.giohoc/20 <3:
empty.append(row.dauvao_overall + 1)
elif row.group_kh_ten == "KHOÁ KÈM" and row.giohoc/20 >= 3 and row.giohoc/20 <4:
empty.append(row.dauvao_overall + 1.5)
elif row.group_kh_ten == "KHOÁ KÈM" and row.giohoc/20 >= 4 and row.giohoc/20 <5:
empty.append(row.dauvao_overall + 2)
elif row.group_kh_ten == "KHOÁ KÈM" and row.giohoc/20 >= 5 and row.giohoc/20 <6:
empty.append(row.dauvao_overall + 2.5)
elif row.group_kh_ten == "KHOÁ KÈM" and row.giohoc/20 >= 6 and row.giohoc/20 <7:
empty.append(row.dauvao_overall + 3)
elif row.group_kh_ten == "KHOÁ KÈM" and row.giohoc/20 >= 7 and row.giohoc/20 <8:
empty.append(row.dauvao_overall + 3.5)
elif row.group_kh_ten == "KHOÁ KÈM" and row.giohoc/20 >= 8 and row.giohoc/20 <9:
empty.append(row.dauvao_overall + 4.0)
elif row.group_kh_ten == "KHOÁ KÈM" and row.giohoc/20 >= 9 and row.giohoc/20 <10:
empty.append(row.dauvao_overall + 4.5)
elif row.group_kh_ten == "KHOÁ KÈM" and row.giohoc/20 >= 10 and row.giohoc/20 <11:
empty.append(row.dauvao_overall + 5.0)
elif row.group_kh_ten == "KHOÁ KÈM" and row.giohoc/20 >= 11 and row.giohoc/20 <12:
empty.append(row.dauvao_overall + 5.5)
elif row.group_kh_ten == "KHOÁ KÈM" and row.giohoc/20 >= 12 and row.giohoc/20 <13:
empty.append(row.dauvao_overall + 6.0)
elif row.group_kh_ten == "KHOÁ KÈM" and row.giohoc/20 >= 13 and row.giohoc/20 <14:
empty.append(row.dauvao_overall + 6.5)
elif row.group_kh_ten == "KHOÁ KÈM" and row.giohoc/20 >= 14 and row.giohoc/20 <15:
empty.append(row.dauvao_overall + 7.0)
elif row.group_kh_ten == "KHOÁ KÈM" and row.giohoc/20 >= 15 and row.giohoc/20 <16:
empty.append(row.dauvao_overall + 7.5)
else:
empty.append("inspect")
didiem["Needed"] = empty
我认为这会做你想做的(我只为你的一个案例解决了它......)
import numpy
import pandas
num_rows = 1000
# some random values between 2 and 10 for this column
dauvao_overall = numpy.random.uniform(2,10,num_rows)
# some random values between 1 and 200 for this column
giohoc = numpy.random.randint(1,200,num_rows)
# some random values for this column
group_kh_ten = numpy.random.choice(["KHOA NHOM","KHOA KEM"],num_rows)
#make a dataframe
df = pandas.DataFrame({"dauvao_overall":dauvao_overall,"giohoc":giohoc, "group_kh_ten":group_kh_ten})
df['needed'] = 0
# here is how you would solve KHOA KEM
khoa_kem = df['group_kh_ten']=='KHOA KEM'
df.loc[khoa_kem,"needed"] = (df[khoa_kem]['dauvao_overall'] + 0.5) * (df[khoa_kem]['giohoc']//25)
print(df)
首先,定义一个 function 来计算Needed
值。 它将收到 dataframe 行,并进行计算。
def fun(row):
group_kh, overall, giohoc = [row[col_name]
for col_name in ['group_kh_ten', 'dauvao_overall', 'giohoc']]
match group_kh:
case 'KHOÁ NHÓM':
needed = overall + (giohoc // 25) * 0.5
case 'KHOÁ KÈM' :
needed = overall + (giohoc // 20) * 0.5
if giohoc // 20 >= 16: needed = 'inspect'
case _ :
print("error: wrong group_kh_ten")
return needed
在 dataframe 的每一行上应用 function:
df['Needed'] = df.apply(fun, axis=1)
例子:
group_kh_ten dauvao_overall giohoc
0 KHOÁ NHÓM 2.0 70.0
1 KHOÁ KÈM 3.5 80.0
应用 function fun
:
df['Needed'] = df.apply(fun, axis=1)
Output:
group_kh_ten dauvao_overall giohoc Needed
0 KHOÁ NHÓM 2.0 70.0 3.0
1 KHOÁ KÈM 3.5 80.0 5.5
感谢@AndrzejO 和@Joran Beasley 的公式:
需要 = 总体 + (giohoc // 25) * 0.5
我想出了一个更短的方法。
empty =[]
for index, row in didiem.iterrows():
# KHOÁ NHÓM
if row.group_kh_ten == "KHOÁ NHÓM":
empty.append(row.dauvao_overall + row.giohoc//25 * 0.5)
# KHOÁ KÈM
elif row.group_kh_ten == "KHOÁ KÈM":
empty.append(row.dauvao_overall + row.giohoc//20 * 0.5)
else:
empty.append("Null")
didiem["Needed"] = empty
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.