У меня есть 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().
Не используйте 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
попробуйте 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)
Используйте 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