2017-08-01 76 views
2

組之後,我有Dataframe這樣滾動粘貼值的字符串由

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 

我想要得到的各group(由E-Mail)滾動粘貼,窗口= 2。

這是我目前的方法。

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 

有沒有更簡單的方法來實現這一目標?

+1

@ScottBoston我沒有管理很長一段時間..Let我做這個工作,並添加到我的個人資料等等:) – Wen

回答

3

使用的shift代替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,很好的解決方案,救我天!將在2分鐘後接受它〜 – Wen

+0

很高興我可以幫助( - : – piRSquared