2016-06-08 15 views
0

ich bin neu in Pandas und ich war eine Aufgabe gegeben: für jedes Produkt drei andere Produkte, die am meisten gesehen werden zusammen in der gleichen SitzungPandas Python. Top 3 Hinweise in einer Spalte

Datenrahmen viewed.products wie folgt aussieht:

session    products 
00b3a43caf4209d2/10 1536 
00b3a43caf4209d2/10 42 
00b3a43caf4209d2/10 395 
00b3a43caf4209d2/10 590 
00b3a43caf4209d2/10 2031 
00b3a43caf4209d2/11 1309 
00b3a43caf4209d2/11 1879 
00b3a43caf4209d2/11 1309 
00b3a43caf4209d2/11 1879 
00b3a43caf4209d2/5 73 
00b3a43caf4209d2/5 147 
00b3a43caf4209d2/5 585 
00b3a43caf4209d2/5 774 
00b3a43caf4209d2/5 781 
00b3a43caf4209d2/5 1384 
00b3a43caf4209d2/5 1463 
00b3a43caf4209d2/6 73 
00b3a43caf4209d2/6 156 
00b3a43caf4209d2/6 1669 
00b3a43caf4209d2/6 52 
00b3a43caf4209d2/6 73 
00b3a43caf4209d2/6 156 

und die gewünschte Ausgabe würde aussehen wie (zum Beispiel):

product recommended_products 
1536 42 
     73 
     2031 
42  73 
     1309 
     156 
395  781 
     585 
     1536 
590  147 
     42 
     781 

ich nehme an, es habe eine Aggregatfunktion zu gruppieren, um sie, aber ich kann nicht herausfinden, welche.

+3

ich das Muster nicht sehen der Auswahl von 'recommended_products'. – Lafexlos

Antwort

1

ich glaube, Sie erste merge Spalte products auf session verwenden und dann groupby mit nlargest verwenden, wenn brauchen Top-3 Werte:

print (df) 
        products 
session      
00b3a43caf4209d2/10  1536 
00b3a43caf4209d2/10  42 
00b3a43caf4209d2/10  395 
00b3a43caf4209d2/10  590 
00b3a43caf4209d2/10  2031 
00b3a43caf4209d2/11  1309 
00b3a43caf4209d2/11  1879 
00b3a43caf4209d2/11  1309 
00b3a43caf4209d2/11  1879 
00b3a43caf4209d2/5   73 
00b3a43caf4209d2/5  147 
00b3a43caf4209d2/5  585 
00b3a43caf4209d2/5  774 
00b3a43caf4209d2/5  781 
00b3a43caf4209d2/5  1384 
00b3a43caf4209d2/5  1463 
00b3a43caf4209d2/6   73 
00b3a43caf4209d2/6  156 
00b3a43caf4209d2/6  1669 
00b3a43caf4209d2/6   52 
00b3a43caf4209d2/6   73 
00b3a43caf4209d2/6  156 
#if first column is index 
df.reset_index(inplace=True) 

df = pd.merge(df[['products', 'session']], 
       df[['products', 'session']], 
       on='session', 
       suffixes=('','_recommended')) 

print (df) 
    products    session products_recommended 
0  1536 00b3a43caf4209d2/10     1536 
1  1536 00b3a43caf4209d2/10     42 
2  1536 00b3a43caf4209d2/10     395 
3  1536 00b3a43caf4209d2/10     590 
4  1536 00b3a43caf4209d2/10     2031 
5   42 00b3a43caf4209d2/10     1536 
6   42 00b3a43caf4209d2/10     42 
7   42 00b3a43caf4209d2/10     395 
8   42 00b3a43caf4209d2/10     590 
9   42 00b3a43caf4209d2/10     2031 
10  395 00b3a43caf4209d2/10     1536 
11  395 00b3a43caf4209d2/10     42 
12  395 00b3a43caf4209d2/10     395 
13  395 00b3a43caf4209d2/10     590 
14  395 00b3a43caf4209d2/10     2031 
... 
... 
print (df.groupby(['session','products'])['products_recommended'] 
     .nlargest(3) 
     .reset_index() 
     .drop('level_2', axis=1)) 

       session products products_recommended 
0 00b3a43caf4209d2/10  42     2031 
1 00b3a43caf4209d2/10  42     1536 
2 00b3a43caf4209d2/10  42     590 
3 00b3a43caf4209d2/10  395     2031 
4 00b3a43caf4209d2/10  395     1536 
5 00b3a43caf4209d2/10  395     590 
6 00b3a43caf4209d2/10  590     2031 
7 00b3a43caf4209d2/10  590     1536 
8 00b3a43caf4209d2/10  590     590 
9 00b3a43caf4209d2/10  1536     2031 
10 00b3a43caf4209d2/10  1536     1536 
11 00b3a43caf4209d2/10  1536     590 
12 00b3a43caf4209d2/10  2031     2031 
13 00b3a43caf4209d2/10  2031     1536 
... 
... 
Verwandte Themen