У меня есть df, как показано ниже, и я пытаюсь создать новый столбец с именем df['Seat_AVAIL'] на основе столбца plan и столбца Mem_Count.

По существу :

ЕСЛИ df['Plan'] = ('LUX' или 'Premium'), то вычислите df['Seat_AVAIL'], выполнив (10+ ( mem_count val -1) * 5),

Elif df['Plan'] = 'Limited' затем вычислите df['Seat_AVAIL'] (5+ ( mem_count val -1) * 2), чтобы вычислить Mem_count

Иначе df['PLAN'] = 'Free', тогда df['Seat_AVAIL'] должно быть нулевым.

ДАННЫЕ:

ID    Guest_COUNT   Mem_COUNT   Plan
8472    82            20     Free 
2426    67            10     Premium
2299    55            21     LUX
3787    48            52     LIMITED
2553    41            12     Free 
8660    39            16     Premium

Пример желаемого результата с расчетом для Seat_AVAIL

ID    Guest_COUNT   Mem_COUNT   Seat_AVAIL    Plan
8472    82            20          NULL             Free 
2426    67            10          50               Premium
2299    55            21         110               LUX
3787    48            6           15               LIMITED
2553    41            12         NULL              Free 
8660    39            8           45               Premium

Я попытался сделать что-то подобное непосредственно в таблицах Google с помощью оператора ifs, но возникли ошибки, и решил, что у python может быть быстрое решение.

1
Blackdynomite 9 Апр 2021 в 10:01

1 ответ

Лучший ответ

Используйте numpy.select с указанными масками и выходами, если не совпадают никакие значения маски, возвращается тот же столбец:

m1 = df['Plan'].isin(['LUX', 'Premium'])
m2 = df['Plan'] == 'Limited'
m3 = df['Plan'] == 'Free'

s1 = 10+(df['Mem_COUNT']-1)*5
s2 = 5+(df['Mem_COUNT']-1)*2

df['Seat_AVAIL'] = np.select([m1, m2, m3], [s1, s2, np.nan], default=df['Mem_COUNT'])

print (df)
     ID  Guest_COUNT  Mem_COUNT     Plan  Seat_AVAIL
0  8472           82         20     Free         NaN
1  2426           67         10  Premium        55.0
2  2299           55         21      LUX       110.0
3  3787           48         52  LIMITED        52.0 <- no match
4  2553           41         12     Free         NaN
5  8660           39         16  Premium        85.0

Или, если нужно сопоставить только первые 2 маски, и если совпадения нет, всегда возвращать NaN:

df['Seat_AVAIL'] = np.select([m1, m2], [s1, s2], default=np.nan)

print (df)
     ID  Guest_COUNT  Mem_COUNT     Plan  Seat_AVAIL
0  8472           82         20     Free         NaN
1  2426           67         10  Premium        55.0
2  2299           55         21      LUX       110.0
3  3787           48         52  LIMITED         NaN <- no match
4  2553           41         12     Free         NaN
5  8660           39         16  Premium        85.0
1
jezrael 9 Апр 2021 в 07:11