2017-08-01 1 views
2

Ich habe Dataframe wie dieseRollen Paste Wert Zeichenfolge nach Gruppe von

df = pd.DataFrame({'E-Mail': np.random.choice(list('AB'), 20), 
        'Session': np.random.randint(1, 10, 20)}) 
df.Session=df.Session.astype(str) 

df 

Out[350]: 
    E-Mail Session 
0  A  7 
1  A  8 
2  A  6 
3  A  1 
4  B  6 
5  A  6 
6  A  3 
7  A  9 
8  B  5 
9  B  3 
10  B  5 
11  B  6 
12  B  1 
13  B  5 
14  A  3 
15  A  6 
16  A  8 
17  A  2 
18  A  4 
19  A  6 

ich die Roll Paste jedes group (durch E-Mail), Fenster = 2 erhalten möchten.

Dies ist meine Vorgehensweise ab sofort.

def running_paste(s, n): 
     return [','.join(s[lo:lo + n]) for lo in range(len(s) - n + 1)] 
A=[] 
for name, df1 in df.groupby('E-Mail'): 
    df1['LOL'] = np.append(np.nan, running_paste(df1.Session, 2)) 
    A.append(df1) 
pd.concat(A,axis=0) 



Out[352]: 
    E-Mail Session LOL 
0  A  7 nan 
1  A  8 7,8 
2  A  6 8,6 
3  A  1 6,1 
5  A  6 1,6 
6  A  3 6,3 
7  A  9 3,9 
14  A  3 9,3 
15  A  6 3,6 
16  A  8 6,8 
17  A  2 8,2 
18  A  4 2,4 
19  A  6 4,6 
4  B  6 nan 
8  B  5 6,5 
9  B  3 5,3 
10  B  5 3,5 
11  B  6 5,6 
12  B  1 6,1 
13  B  5 1,5 

Gibt es einen einfacheren Weg, dies zu erreichen?

+1

@ScottBoston Ich schaffe ich es nicht für eine lange Zeit ..Let mich daran zu arbeiten, und zu meinem Profil hinzufügen so :) – Wen

Antwort

3

Mit shift statt rolling

df.assign(
    LOL=df.groupby('E-Mail').Session.apply(
     lambda x: (lambda y: y.shift() + ',' + y)(x.astype(str)) 
    ) 
) 

    E-Mail Session LOL 
0  A  7 NaN 
1  A  8 7,8 
2  A  6 8,6 
3  A  1 6,1 
5  A  6 1,6 
6  A  3 6,3 
7  A  9 3,9 
14  A  3 9,3 
15  A  6 3,6 
16  A  8 6,8 
17  A  2 8,2 
18  A  4 2,4 
19  A  6 4,6 
4  B  6 NaN 
8  B  5 6,5 
9  B  3 5,3 
10  B  5 3,5 
11  B  6 5,6 
12  B  1 6,1 
13  B  5 1,5 
+1

WOW, schöne Lösung, speichern meine Tag! werde es nach 2 Minuten annehmen ~ – Wen

+0

Froh ich könnte helfen (-: – piRSquared

Verwandte Themen