2017-09-22 4 views
0

私は訪問日の昇順でユーザーが訪れたページをリストした次のデータフレームを作成しました。 BLQ2_1〜BLQ2_5の合計5ページあります。時間順のページビューデータフレーム内の特定のページの前に以前に訪問したものを数える

user_id created_at PAGE 
72672 2017-02-20 BLQ2_1 
72672 2017-03-03 BLQ2_5 
72672 2017-03-03 BLQ2_3 
72672 2017-03-05 BLQ2_4 
12370 2017-03-06 BLQ2_4 
12370 2017-03-06 BLQ2_5 
12370 2017-03-06 BLQ2_3 
94822 2017-03-06 BLQ2_2 
94822 2017-03-10 BLQ2_4 
94822 2017-03-10 BLQ2_5 
94822 2017-02-24 BLQ2_4 

各ページについて、すべてのユーザーを考慮して訪問した前のページに関する統計情報を取得する必要があります。つまり、各ページの統計情報を計算する必要があります。

BLQ2_5へのパスは、BLQ2_4から2回、BLQ2_1から1回です。

BLQ2_3へのパスは、BLQ2_5から2回、BLQ2_4から1回です。

BLQ2_4へのパスは、BLQ2_5から1回、BLQ2_3から1回、BLQ2_2から1回、どこからも1回です。

ループを使用する必要がありますか?または、パンダの機能を利用する方法がありますか?groupby助言がありますか?以下は

forループを使用して、私のソリューションです:

pg_BLQ2_5 = pd.DataFrame() 
pg_BLQ2_4 = pd.DataFrame() 
pg_BLQ2_3 = pd.DataFrame() 
pg_BLQ2_2 = pd.DataFrame() 
pg_BLQ2_1 = pd.DataFrame() 
first_pages = pd.DataFrame() 

for user_id in df['user_id'].unique(): 
    #get only current user's records, and reset index 
    _pg = df[df['user_id'] == user_id].reset_index() 
    _pg.drop('index', axis=1, inplace=True) 

    #if this is the first page visited, treat differently 
    first_page = _pg.iloc[0] 
    first_pages = first_pages.append(first_page) 

    #exclude the first page visited from the dataframe 
    _pg = _pg.loc[1:].reset_index() 
    _pg.drop('index', axis=1, inplace=True) 

    #for each page, get the record from its previous index, and build the dataframe. 
    pg_BLQ2_5 = pg_BLQ2_5.append(_pg.iloc[_pg[_pg['PAGE'] == 'BLQ2_5'].index -1]) 
    pg_BLQ2_4 = pg_BLQ2_4.append(_pg.iloc[_pg[_pg['PAGE'] == 'BLQ2_4'].index -1]) 
    pg_BLQ2_3 = pg_BLQ2_3.append(_pg.iloc[_pg[_pg['PAGE'] == 'BLQ2_3'].index -1]) 
    pg_BLQ2_2 = pg_BLQ2_2.append(_pg.iloc[_pg[_pg['PAGE'] == 'BLQ2_2'].index -1]) 
    pg_BLQ2_1 = pg_BLQ2_1.append(_pg.iloc[_pg[_pg['PAGE'] == 'BLQ2_1'].index -1]) 

答えて

1

まず、前のページ(これはデータフレームを日付によって、ユーザによってソートされていると仮定)を示す列を作成:次に

df['prev'] = df['PAGE'].shift() 
# remove when different user 
df['prev'] = df['prev'].where(df['user_id'].shift() == df['user_id'], np.nan) 

を単純にgroupbyとカウント値:

df.groupby('PAGE')['prev'].value_counts() 

PAGE prev 
BLQ2_3 BLQ2_5 2 
BLQ2_4 BLQ2_2 1 
     BLQ2_3 1 
     BLQ2_5 1 
BLQ2_5 BLQ2_4 2 
     BLQ2_1 1 

また、で再構成することもできます例えば、。

+0

ありがとうございました。 OPの上で、forループを使って私のアプローチを共有しました。しかし、何らかの理由で私が得た結果は、あなたのソリューションで得た結果とはまったく異なります。いずれのソリューションでも問題は発生しませんが、問題を把握できませんでした。あなたは何か考えていますか?あなたのコードでは: 'BLQ2_2 - > BLQ2_1 = 151'、私のコードでは' 68'です。 – renakre

+0

投稿した小さな例題はどうですか?私はあなたが提案したものとは異なる結果を得ていましたが、あなたは完全なデータフレームを示していないと思いました。これで別の結果も得られますか? – IanS

+0

はい、私は共有したサンプルデータを使用して計算しようとしています。私のコードには問題があると思う。 – renakre

関連する問題