Как увеличить функцию в зависимости от состояния? - PullRequest
1 голос
/ 11 октября 2019
data = [['john', 'A01', 1],['john', 'A01', 1],['john', 'A01', 1],['john', 'B01', 0],['john', 'C01', 0],['katty', 'A01', 0],['katty', 'B01', 0]]

df = pd.DataFrame(data, columns = ['name', 'orderID','buying_channel']) 

purchase_channel = df.groupby('name').apply(lambda x: pd.Series({"buying_channel": sum((x.buying_channel)/(x.buying_channel.count()))}))

purchase_channel.head()

Я хочу вычислить человека, покупающего канал, «1» - это канал, «0» - это другой. (1 = онлайн, 0 = автономно)

Вместо вычисления в целом, что дает 0,6, я хочу рассчитать его на основе идентификатора заказа.

Ожидаемый результат:

data2 = [['john', 0.33], ['katty', 0]]
df2 = pd.DataFrame(data2, columns = ['name','buying_channel'])
df2

Потому что «Джон» покупает 3 раза, только один раз - онлайн, остальные - в автономном режиме. следовательно, как аггить на основе orderID?

Спасибо

Ответы [ 3 ]

1 голос
/ 11 октября 2019

Отредактировано на основе редактирования ОП:

import pandas as pd
data = [['john', 'A01', 1],['john', 'A01', 1],['john', 'A01', 1],['john', 'B01', 0],['john', 'C01', 0],['katty', 'A01', 0],['katty', 'B01', 0]]
df = pd.DataFrame(data, columns = ['name', 'orderID','buying_channel']) 
df_1 = df.merge(df.groupby(['name','orderID'],as_index=False)['buying_channel'].sum(),on=['name','orderID'],how='left')
df_1['purchase_channel'] = df_1['buying_channel_x']/df_1['buying_channel_y']
df_1 = df_1.drop(['buying_channel_y'],axis=1).fillna(0).rename(columns={'buying_channel_x':'buying_channel'}).groupby('name')['purchase_channel'].max()
print(df_1)

Вывод:

name
john     0.333333
katty    0.000000
Name: purchase_channel, dtype: float64
1 голос
/ 11 октября 2019

Вы можете удалить дубликаты на name, orderID и усреднить значение на buying_channel:

(df.drop_duplicates(['name','orderID'])
   .groupby('name', as_index=False)
   .buying_channel.mean()
)

Вывод:

    name  buying_channel
0   john        0.333333
1  katty        0.000000
0 голосов
/ 11 октября 2019

Я думаю, что то, что вы пытаетесь получить, может быть достигнуто с помощью .value_counts(normalize=True).

Документов для value_counts () .

Надеюсь, это поможет! Если это не то, что вы ищете, пожалуйста, уточните вопрос, так как я нахожу это немного запутанным. Это также поможет другим, у кого могут быть лучшие идеи для решения вашей проблемы.

РЕДАКТИРОВАТЬ1:

После редактирования вопроса, я думаю, вы могли бы добиться этого следующим образом:

df.groupby('name')['buying_channel'].apply(lambda x: x.value_counts(normalize=True)[1] if (x==1).sum() else 0)

, который выводит:

name
john     0.6
katty    0.0
Name: buying_channel, dtype: float64

В лямбда-выражении после нормализованного value_counts() я выбираю результат для 1, получая пропорцию числа раз 1 для каждого имени. Предложение else позволяет избежать ошибок в случае, если для данного имени не было 1 s, как это происходит с 'katty'.

Если вы хотите, вы можете получить даафрам из этого добавления .to_frame() вконец.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...