时间:2017-08-01 18:01:55

标签: python pandas

我有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

我希望获得每个groupE-Mail),windows = 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 个答案:

答案 0 :(得分: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