iba*_*ant 3 python pivot pandas
我有一个带有会话ID,URL和TimeStamp的熊猫数据框,格式如下:
SessionId TimeStamp URL
aa420858 20:24 url1
aa420858 20:26 url2
aa420858 20:27 url3
bb779bc3 18:18 other_url1
bb779bc3 18:21 other_url2
bb779bc3 18:24 other_url3
bb779bc3 18:25 other_url4
zz920853 20:27 diff_url1
zz920853 20:28 diff_url2
Run Code Online (Sandbox Code Playgroud)
我需要获得以下格式:
SessionId URL1 URL2 URL3 URL4 TimeStamp1 TimeStamp2 TimeStamp3 TimeStamp4
aa420858 url1 url2 url3 20:26 20:27 20:27
bb779bc3 other_url1 other_url2 other_url3 other_url4 18:18 18:21 18:24 18:25
zz920853 diff_url1 diff_url2 20:27 20:28
Run Code Online (Sandbox Code Playgroud)
我永远不会事先知道每个会话的网址数量。
我尝试使用pd.melt,pd.pivot_table,pivot(),unstack()等,但未成功。有人可以建议最好的方法吗?另外,是否可以使用时间戳差异来获取页面时间?
非常感谢你!
pivot_table+ concat
df1=df.pivot_table(index='SessionId',columns=df.groupby('SessionId').cumcount(),values='TimeStamp',aggfunc='sum').\
add_prefix('TimeStamp_')
df2=df.pivot_table(index='SessionId',columns=df.groupby('SessionId').cumcount(),values='URL',aggfunc='sum').\
add_prefix('URL_')
pd.concat([df2,df1],1).reset_index()
Out[209]:
SessionId URL_0 URL_1 URL_2 URL_3 TimeStamp_0 \
0 aa420858 url1 url2 url3 None 20:24
1 bb779bc3 other_url1 other_url2 other_url3 other_url4 18:18
2 zz920853 diff_url1 diff_url2 None None 20:27
TimeStamp_1 TimeStamp_2 TimeStamp_3
0 20:26 20:27 None
1 18:21 18:24 18:25
2 20:28 None None
Run Code Online (Sandbox Code Playgroud)
附言 如果从1时需要身份......您可以添加.add(1)在df.groupby('SessionId').cumcount().add(1)
时间差
df['DIFF']=df.groupby('SessionId').TimeStamp.apply(lambda x :pd.to_datetime(x).diff().dt.total_seconds() / 60)
df3=df.dropna()
df3.pivot_table(index='SessionId',columns=df3.groupby('SessionId').cumcount(),values='DIFF',aggfunc='sum').add_prefix('diff')
Out[241]:
diff0 diff1 diff2
SessionId
aa420858 2.0 1.0 NaN
bb779bc3 3.0 3.0 1.0
zz920853 1.0 NaN NaN
Run Code Online (Sandbox Code Playgroud)