【问题标题】:Nested Lambda with If conditions Python带有 If 条件 Python 的嵌套 Lambda
【发布时间】:2021-07-15 01:54:03
【问题描述】:

我需要为我的 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

我可以为第一步创建想法,但是如果第一步的第一个条件不成立,则返回值 2 进行测试,但实际上这个“返回 2”应该被第二步条件替换。

我怎样才能创建这个?我使用 lambda 和方法创建了基本思想:

copiedData1['FinalSL'] = np.where(copiedData1['defaultstore']==1,copiedData1['FCST: TOTAL']*4,2)

它有效,但现在我需要处理第二步的权利条件。

任何帮助将不胜感激!谢谢:)

【问题讨论】:

    标签: python pandas dataframe lambda multiple-conditions


    【解决方案1】:

    您可以使用嵌套的np.where() 来做到这一点。大致像这样(伪代码)答案:

    df['FinalSL'] = np.where(SSS < 3*F, 3*F, np.where(4*F < SSS, 4*F, SSS)))
    

    【讨论】:

      【解决方案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
      

      【讨论】:

      • stackoverflow.com/users/11380795/rj-adriaansen 但是如何创建一个循环来运行每一行?因为如您所见,我在这个数据集中有 20 行?我的意思是我应该如何创建循环来存储该函数中列 [defaultstore]、[SSS] 和 ['FCST: TOTAL'] 的哪一行?
      • apply 会处理这个问题。无需以任何其他方式遍历行。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-28
      • 1970-01-01
      相关资源
      最近更新 更多