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

У меня есть 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

new 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().

Ответы [ 3 ]

0 голосов
/ 21 сентября 2018

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

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
0 голосов
/ 21 сентября 2018

Не используйте 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
0 голосов
/ 21 сентября 2018

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