Pandas数据帧长到大变换,每个索引的行数不同

时间:2017-11-27 19:43:02

标签: python pandas pivot

我有一个pandas数据框,其中包含以下格式的会话ID&#s,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

我需要获得以下格式:

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        

我从来没有事先知道每个会话的一些网址。

我尝试使用pd.melt,pd.pivot_table,pivot(),unstack()等,但没有成功。有人可以建议最好的方法。此外,是否可以使用时间戳的差异来获取页面上的时间?

非常感谢!

1 个答案:

答案 0 :(得分:5)

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  

聚苯乙烯。如果您需要1的ID ...,您可以在.add(1)

中添加df.groupby('SessionId').cumcount().add(1)

时间的DIFF

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