Набор данных раздела по метке времени - PullRequest
0 голосов
/ 13 июня 2018

У меня есть такой фрейм данных из миллионов строк без дублирующих меток времени:

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 голосов
/ 13 июня 2018

Я использую 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...