带有 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)))