代码之家  ›  专栏  ›  技术社区  ›  Ahamed Moosa

如何将elif与数据帧结合使用

  •  -1
  • Ahamed Moosa  · 技术社区  · 8 年前

    我有一个销售数据框,如下所示

        Company         Sales
        MC                360.0
        MC                340.0
        MC                338.5
        MC                335.5
        MC                235.0
        MC                235.0
        MC                234.0
        MC                127.0
        MC                121.0
        MC                120.5
    

    我想根据Sales列的值创建一个新列 我的输出表应该是

        CompanyCode     ActivityDate    Category
        MC                360.0         Fast Mover
        MC                340.0         Fast Mover
        MC                338.5         Fast Mover
        MC                335.5         Fast Mover
        MC                235.0         Medium Fast Mover
        MC                235.0         Medium Fast Mover
        MC                234.0         Medium Fast Mover
        MC                127.0         Slow Mover
        MC                121.0         Slow Mover
        MC                120.5         Slow Mover
    

    我试过elif的陈述

    if df['Sales']>=300:
       df['Category'] = 'Fast Movers'
    elif (df['Sales']>=200) & (df['Sales'] < 300) :
       df['Category'] = 'Medium Fast Movers'
    else:
       df['Category'] = 'Slow Movers'
    

    不确定我的方法是否正确。我将感谢你的帮助和努力。

    3 回复  |  直到 8 年前
        1
  •  3
  •   rafaelc    8 年前

    你可以用 np.select()

    df["Category"] = np.select([df.Sales>=300, df.Sales<200], 
                               ["Fast Movers", "Slow Movers"], 
                               default="Medium Fast Movers")
    
        2
  •  3
  •   Haleemur Ali    8 年前

    将lambda函数(或命名函数)与 apply

    df.Category = df.Sales.apply(
        lambda x: 'Fast Movers' if x >=300 else ('Medium Fast Movers' if x >= 200 else 'Slow Movers')
    )
    

    命名函数可以这样定义,而不是lambda:

    def move_speed(x):
        if x >= 300:
            return 'Fast Movers'
        if x >= 200:
            return 'Medium Fast Movers'
        return 'Slow Movers'
    

    或者,可以使用 loc

    df.loc[df.Sales > 300, 'Category'] = 'Fast Movers'
    df.loc[df.Sales < 200, 'Category'] = 'Slow Movers'
    df.Category.fillna('Medium Fast Movers', inplace=True)
    

    两者都会产生这种数据框架:

      Company  Sales            Category
    0      MC  360.0         Fast Movers
    1      MC  340.0         Fast Movers
    2      MC  338.5         Fast Movers
    3      MC  335.5         Fast Movers
    4      MC  235.0  Medium Fast Movers
    5      MC  235.0  Medium Fast Movers
    6      MC  234.0  Medium Fast Movers
    7      MC  127.0         Slow Movers
    8      MC  121.0         Slow Movers
    9      MC  120.5         Slow Movers
    
        3
  •  1
  •   user3483203    8 年前

    下面是一个使用第二个数据帧和 pd.IntervalIndex 。如果你有大量的范围,这可以让你的代码更干净。

    安装程序

    ranges = pd.DataFrame({
        'START': [0, 200, 300],
        'STOP': [200, 300, float('inf')],
        'CLASS': ['Slow Workers', 'Medium Workers', 'Fast Workers']
    })
    
    #                          CLASS  START        STOP
    # [0.0, 200.0)      Slow Workers      0  200.000000
    # [200.0, 300.0)  Medium Workers    200  300.000000
    # [300.0, inf)      Fast Workers    300         inf
    
    ranges.index = pd.IntervalIndex.from_arrays(ranges.START, ranges.STOP, closed='left')
    

    map

    df['Category'] = df.Sales.map(ranges.CLASS)
    
    # Result
    
      Company  Sales        Category
    0      MC  360.0    Fast Workers
    1      MC  340.0    Fast Workers
    2      MC  338.5    Fast Workers
    3      MC  335.5    Fast Workers
    4      MC  235.0  Medium Workers
    5      MC  235.0  Medium Workers
    6      MC  234.0  Medium Workers
    7      MC  127.0    Slow Workers
    8      MC  121.0    Slow Workers
    9      MC  120.5    Slow Workers