按时间戳分区数据集

时间:2018-06-13 00:26:52

标签: python pandas

我有一个数百万行的数据帧,没有重复的时间ID标记:

ID | Time | Activity 
a  |   1  | Bar 
a  |   3  | Bathroom 
a  |   2  | Bar 
a  |   4  | Bathroom 
a  |   5  | Outside
a  |   6  | Bar 
a  |   7  | Bar

将它转换为此格式的最有效方法是什么?

ID | StartTime | EndTime | Location 
a  |   1       |    2    |  Bar 
a  |   3       |    4    | Bathroom
a  |   5       |   N/A   | Outside
a  |   6       |   7     | Bar

我必须使用大量数据执行此操作,因此想知道如何尽可能加快此过程。

1 个答案:

答案 0 :(得分:1)

我正在使用groupby

df.groupby(['ID','Activity']).Time.apply(list).apply(pd.Series).rename(columns={0:'starttime',1:'endtime'}).reset_index()
Out[251]: 
  ID  Activity  starttime  endtime
0  a       Bar        1.0      2.0
1  a  Bathroom        3.0      4.0
2  a   Outside        5.0      NaN

或使用pivot_table

df.assign(I=df.groupby(['ID','Activity']).cumcount()).pivot_table(index=['ID','Activity'],columns='I',values='Time')
Out[258]: 
I              0    1
ID Activity          
a  Bar       1.0  2.0
   Bathroom  3.0  4.0
   Outside   5.0  NaN

更新

df.assign(I=df.groupby(['ID','Activity']).cumcount()//2).groupby(['ID','Activity','I']).Time.apply(list).apply(pd.Series).rename(columns={0:'starttime',1:'endtime'}).reset_index()
Out[282]: 
  ID  Activity  I  starttime  endtime
0  a       Bar  0        1.0      2.0
1  a       Bar  1        6.0      7.0
2  a  Bathroom  0        3.0      4.0
3  a   Outside  0        5.0      NaN