Как выполнить несколько математических операций для получения нового столбца?

1

У меня есть df, который выглядит так:

consumer_id      order_total
1                    5
2                    6
3                    7
1                    5

Для каждого потребителя consumer_id я хочу взять среднее всех order_total за consumer_id и создать новый столбец SID на основе следующих правил:

if new 'order_total' >= 7:
      SID = 3
elif new 'order_total' >= 6 OR <7:
      SID = 2
else:
      SID = 1

новый df должен выглядеть так (consumer_id 1, в среднем 5):

consumer_id      order_total   SID
1                    5          1
2                    6          2
3                    7          3
1                    5          1

Это утверждение if, которое я пробовал без среднего значения для consumer_id:

if df.order_total >= 150:
    df['SID'] = 3
elif [df.order >= 50] & [df.order< 100]:
    df['SID'] = 2
else:
    df['SID'] = 1

Я получаю ошибку:

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

3 ответа

2
Лучший ответ

Не используйте apply, используйте np.select:

s = df.groupby('consumer_id').order_total.transform('mean')

c1 = s.ge(7)
c2 = s.ge(6) & s.lt(7)

df.assign(SID=np.select([c1, c2], [3, 2], 1))

   consumer_id  order_total  SID
0            1            5    1
1            2            6    2
2            3            7    3
3            1            5    1
1

попробуйте apply:

def f(x):
    if x >= 7:
        SID = 3
    elif x >= 6 and x<7:
        SID = 2
    else:
        SID = 1
    return SID

df['SID']=df['order_total'].apply(f)
  • 1
    Спасибо за сообщение, это не усредняет общую сумму заказа на customer_id или нет?
  • 0
    @RustyShackleford Да, нет?
Показать ещё 5 комментариев
0

Используйте groupby с преобразованием, чтобы получить серию, содержащую средний объем заказа на потребительский_ид, а затем примените функцию к серии для создания серии результатов.

def sid_assign(x):
    if x >= 7:
        return 3
    if x >= 6 | x < 7:
        return 2
    else:
        return 1

id_sums = df.groupby('consumer_id').order_total.transform('mean')
df['SID'] = id_sums.apply(sid_assign)

print(df)

   consumer_id  order_total  SID
0            1            5    1
1            2            6    2
2            3            7    3
3            1            5    1

Ещё вопросы

Сообщество Overcoder
Наверх
Меню