У меня есть файл csv в pyspark с большим количеством информации о продажах - единицы, идентификатор магазина, общие продажи, лояльность клиентов, номер продукта и т. Д.

Мне нужно сравнить количество продаж клиентов, включенных в план лояльности, с количеством продаж клиентов, которые не входят в план лояльности. Все клиенты в плане лояльности представлены в поле "collector_key" с положительным целым числом, а те, которые не представлены, представлены с отрицательным целым числом, например:

>>> df.head(10)
  collector_key  sales
0             -1  42.72
1             -1  27.57
2   139517343969  62.44
3             -1   0.00
4             -1   0.00
5             -1   7.32
6             -1  64.51
7             -1   0.00
8   134466064080  20.72
9             -1   0.00

Сначала я подумал, что, возможно, я мог бы использовать оператор if / else, чтобы перетасовать пользователей в списки лояльности и нелояльности. Но потом я подумал, что, может быть, было бы более эффективно просто отфильтровать лояльных клиентов в их собственные фреймы данных и сделать то же самое с нелояльными клиентами, а затем просто вычесть два результата. Я подумал, может быть, я смогу сделать регулярное выражение для столбца "collector_key":

non_loy_cust = test_1.filter(regex='^(-?\d+)\s+')

Но тогда я не уверен, как сохранить столбец «продажи», поскольку «регулярное выражение» и «элементы» исключают друг друга.

Вдобавок к этому мне нужно будет суммировать столбцы продаж, чтобы у меня было единое число для лояльных и нелояльных клиентов, но я думаю (как только я преодолею предыдущее препятствие) могу сделать это примерно так:

loy_sales = df.groupby('sales').max()
non_loy_sales = df2.groupby('sales').max()

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

0
lengthy_preamble 1 Мар 2018 в 20:30

1 ответ

Лучший ответ

Я думаю, вы ищете .transform()

# set group first
df['collector_key'] = df['collector_key'].map(lambda x: 0 if x == -1 else 1)


#loyalty (1) vs non-loyalty sales(0)
df.groupby('collector_key')['sales'].sum() 

   collector_key
0    142.12
1     83.16

# adding max sales column
df['max_sales'] = df.groupby('collector_key')['sales'].transform('max')

    collector_key   sales   max_sales
0        -1         42.72   64.51
1        -1         27.57   64.51
2    139517343969   62.44   62.44
3        -1         0.00    64.51
4        -1         0.00    64.51
5        -1         7.32    64.51
1
YOLO 1 Мар 2018 в 21:07