Панды перебирают массивы с помощью groupby - PullRequest
0 голосов
/ 01 мая 2018

Я загрузил CSV с 3 столбцами: метка времени, идентификатор пользователя и идентификатор кампании. У каждого пользователя есть> 1 идентификатор кампании с отметкой времени. Необработанные данные выглядят следующим образом:

                   date    user_id           ad_campaign
0      2018-01-10 0:21:09  151312395      Search - Special
1      2018-01-10 0:21:19  151312395    Display - Branding
2      2018-01-10 0:21:32  151312395    Display - Branding
3      2018-01-10 0:21:09  151312395      Search - Special
4      2018-01-10 0:21:19  151312395    Display - Branding
5      2018-01-10 0:21:32  151312395    Display - Branding
6     2018-01-30 19:18:37  158490415               Display
7     2018-01-30 19:19:03  158490415               Display
8      2018-01-31 1:36:12  158490415              Branding

Моя цель - отобразить порядок различных идентификаторов кампании для каждого пользователя, чтобы проанализировать, какая кампания часто идет первой, второй, последней и так далее. Я удалил дубликаты, заказал временную метку, сгруппировал по userID и поместил кампанию за пользователя в массиве. Теперь я хочу создать цикл, который выполняет итерации по массиву каждого пользователя, а затем назначает каждой кампании для каждого пользователя «место», например 1-е, 2-е, 3-е (шаг после этого будет приписывать баллы каждой кампании в соответствии с тем, где в userjourney они, чтобы сделать мою цель более ясной). Это код, который я сейчас имею:

import pandas as pd
import numpy as np
import datetime
import os
import matplotlib.pyplot as plt


columnnames = ['date','user_id', 'ad_campaign']
df=pd.read_csv(r'C:\Users\L\Desktop\Data.csv' , 
    sep='\t',names = columnnames, usecols=[0,1,4],  
    parse_dates=True)

df=df.drop_duplicates(subset=['user_id','date', 'ad_campaign'])
df=df.set_index('date').sort_index()
df=(df.groupby(['user_id'])['ad_campaign'].apply(list)) 

print(df)

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

user_id
151312395    [Search - Special, Display - Branding, Display...
158490415    [Display, Display, Branding, Display, Display,...
176204518    [Display, Display, Display, Display, Pathfinde...
182053572    [Branding, Branding, Branding, Display]

Я пытался зацикливаться с помощью iterrows, itertuples, itervalues ​​и т. Д., Но мне кажется, что я что-то упускаю из-за способа хранения этих данных, потому что я продолжаю получать разные ошибки. Какой цикл я должен использовать?

1 Ответ

0 голосов
/ 01 мая 2018

Я сделаю тебя лучше. Давайте отбросим промежуточное представление столбцов списков (с ним действительно сложно работать и оно дает нулевой выигрыш в производительности). Вместо этого пометьте каждую кампанию своим уникальным порядковым номером (сделано с помощью groupby + cumcount), а затем вы можете сделать что-то простое, например, группировать mean по кампании.

df = df.sort_values(by='date')

(df.groupby(['user_id'], sort=False)
   .cumcount()
   .groupby(df.ad_campaign)
   .mean()
   .sort_values(ascending=True)
)

ad_campaign
Display               0.5
Search - Special      0.5
Branding              2.0
Display - Branding    3.5
dtype: float64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...