Создание нового столбца в кадре данных на основе результата добавления трех других

Я произвел следующий код:

data['Customer_segment'] = np.where(((data['Order frequency segment']+data['order_size_seg']+data['MOVC % segment'])<=5,1),
np.where((data['Order frequency segment']+data['order_size_seg']+data['MOVC % segment'])>5 & (data['Order frequency segment']+data['order_size_seg']+data['MOVC % segment'])<=8,2),
np.where((data['Order frequency segment']+data['order_size_seg']+data['MOVC % segment'])>8 & (data['Order frequency segment']+data['order_size_seg']+data['MOVC % segment'])<=11,3),
np.where((data['Order frequency segment']+data['order_size_seg']+data['MOVC % segment'])>11 & (data['Order frequency segment']+data['order_size_seg']+data['MOVC % segment'])<=14,4),5)

Я получаю следующую ошибку:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Был бы очень признателен за помощь в достижении лучшего решения, я чувствую, что то, что я пытаюсь сделать, может быть не оптимальным.

Пример ввода следующий:

MOVC % segment  order_size_seg  Order frequency segment
1                      2                 3
5                      2                 1
5                      5                 5

Я пытаюсь добавить столбец на основе результата суммирования каждой строки следующим образом:

если 3-5 то 1 если 6-8 то 2 если 9-11 то 3 если 12-14 то 4 если 15+ то 5

Действительно помог бы с этим

3 ответа

Решение

Я думаю, что вам нужно вместо нескольких np.where один numpy.select:

#only once sum values 
a = data['Order frequency segment']+data['order_size_seg']+data['MOVC % segment']
#conditions with ()
m1 = a<=5
m2 = (a>5) & (a<=8)
m3 = (a>8) & (a<=11)
m4 = (a>11) & (a<=14)

data['Customer_segment'] = np.select([m1, m2, m3, m4],[1,2,3,4], default=5)

Другое решение - использование cut:

bins = [-np.inf,5,8,11,14, np.inf]
labels = [1,2,3,4,5]

data['Customer_segment'] = pd.cut(df['B'], bins=bins, labels=labels)

Как насчет попробовать pd.cut

df = pd.DataFrame([[1,2,3],[5,2,1],[5,5,5]], columns=['M','O','F'])

pd.cut(df.T.sum(),[5, 8, 11, 14,np.inf],labels=[1,2,3,4]) 

Out[1180]: 
0    1
1    1
2    4
dtype: category

Как насчет query метод? Кажется, у него действительно мощный синтаксис:

import pandas as pd
d = pd.DataFrame([[1,2,3],[5,2,1],[5,5,5]], columns=['M','O','F'])
d.query("5 < M+O+F < 8")

Out[4]: 
   M  O  F
1  5  2  1
Другие вопросы по тегам