как использовать elif с пандами данных - PullRequest
0 голосов
/ 26 мая 2018

У меня есть кадр данных о продажах, который выглядит следующим образом

    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 ]

0 голосов
/ 26 мая 2018

Вот решение с использованием второго кадра данных и 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
0 голосов
/ 26 мая 2018

Вы можете использовать np.select()

df["Category"] = np.select([df.Sales>=300, df.Sales<200], 
                           ["Fast Movers", "Slow Movers"], 
                           default="Medium Fast Movers")
0 голосов
/ 26 мая 2018

используйте лямбда-функцию (или именованную функцию) с apply

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

вместо лямбды, именованную функцию можно определить так:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...