带有 If 条件的嵌套 Lambda Python
Nested Lambda with If conditions Python
我需要为我的 daframe“copieddata1”创建一个新列 (FinalSL),条件如下:
第一步:
If ['defaultstore'] column = 1: then [FinalSL]= 4*['FCST: TOTAL'] column values
if no> then check if ['SSS'] column is supporting the follow condition(2nd Step):
第二步:
3*['FCST: TOTAL'] column values < ['SSS'] column values < 4*['FCST: TOTAL'] column values
所以我有三种可能的结果:
1st' ['SSS'] < 3*['FCST: TOTAL'] then ['FinalSL'] = 3['FCST: TOTAL']
2nd' 3*['FCST: TOTAL'] < ['SSS'], but 4*['FCST: TOTAL'] < SSS tehn ['FinalSL'] = 3['FCST: TOTAL']
3rd' 3*['FCST: TOTAL'] < ['SSS'] < 4*['FCST: TOTAL'] then ['FinalSL'] = ['SSS']
那么,总而言之,我相信我有以下条件可以应用到我的代码中:
if SSS < 3*F then
FinalSL = 3*F
else
if 4*F < SSS then
FinalSL = 3*F
else
FinalSL = SSS
我可以为第一步创建想法,但如果第一步的第一个条件不成立,则使用 return 值 2 进行测试,但实际上这个“return 2 " 应替换为第二步条件。
我怎样才能创建这个?我使用 lambda 创建了基本思想,方法适用:
copiedData1['FinalSL'] = np.where(copiedData1['defaultstore']==1,copiedData1['FCST: TOTAL']*4,2)
成功了,但现在我需要处理第 2 步中的权限条件。
任何帮助将不胜感激!谢谢:)
你的伪代码很不清楚,所以我接受了你的总结。您可以将其转换为一个函数:
def process_dataframe(row):
if row['defaultstore']==1:
if row['SSS'] < 3*row['FCST: TOTAL']:
return 3*row['FCST: TOTAL']
elif 4*row['FCST: TOTAL'] < row['SSS']:
return 3*row['FCST: TOTAL']
else:
return row['SSS']
else:
return None
然后您可以在分配新列时通过此函数传递数据帧:
df['FinalSL'] = df.apply(process_dataframe, axis=1) #axis=1 makes pandas pass the rows to the function in stead of columns
您可以使用嵌套的 np.where()
来做到这一点。大致像这样(伪代码)答案:
df['FinalSL'] = np.where(SSS < 3*F, 3*F, np.where(4*F < SSS, 4*F, SSS)))
我需要为我的 daframe“copieddata1”创建一个新列 (FinalSL),条件如下:
第一步:
If ['defaultstore'] column = 1: then [FinalSL]= 4*['FCST: TOTAL'] column values
if no> then check if ['SSS'] column is supporting the follow condition(2nd Step):
第二步:
3*['FCST: TOTAL'] column values < ['SSS'] column values < 4*['FCST: TOTAL'] column values
所以我有三种可能的结果:
1st' ['SSS'] < 3*['FCST: TOTAL'] then ['FinalSL'] = 3['FCST: TOTAL']
2nd' 3*['FCST: TOTAL'] < ['SSS'], but 4*['FCST: TOTAL'] < SSS tehn ['FinalSL'] = 3['FCST: TOTAL']
3rd' 3*['FCST: TOTAL'] < ['SSS'] < 4*['FCST: TOTAL'] then ['FinalSL'] = ['SSS']
那么,总而言之,我相信我有以下条件可以应用到我的代码中:
if SSS < 3*F then
FinalSL = 3*F
else
if 4*F < SSS then
FinalSL = 3*F
else
FinalSL = SSS
我可以为第一步创建想法,但如果第一步的第一个条件不成立,则使用 return 值 2 进行测试,但实际上这个“return 2 " 应替换为第二步条件。
我怎样才能创建这个?我使用 lambda 创建了基本思想,方法适用:
copiedData1['FinalSL'] = np.where(copiedData1['defaultstore']==1,copiedData1['FCST: TOTAL']*4,2)
成功了,但现在我需要处理第 2 步中的权限条件。
任何帮助将不胜感激!谢谢:)
你的伪代码很不清楚,所以我接受了你的总结。您可以将其转换为一个函数:
def process_dataframe(row):
if row['defaultstore']==1:
if row['SSS'] < 3*row['FCST: TOTAL']:
return 3*row['FCST: TOTAL']
elif 4*row['FCST: TOTAL'] < row['SSS']:
return 3*row['FCST: TOTAL']
else:
return row['SSS']
else:
return None
然后您可以在分配新列时通过此函数传递数据帧:
df['FinalSL'] = df.apply(process_dataframe, axis=1) #axis=1 makes pandas pass the rows to the function in stead of columns
您可以使用嵌套的 np.where()
来做到这一点。大致像这样(伪代码)答案:
df['FinalSL'] = np.where(SSS < 3*F, 3*F, np.where(4*F < SSS, 4*F, SSS)))