Dataframe groupby - список значений - PullRequest
3 голосов
/ 24 апреля 2019

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

driver_id                           status  dttm
9f8f9bf3ee8f4874873288c246bd2d05    free    2018-02-04 00:19
9f8f9bf3ee8f4874873288c246bd2d05    busy    2018-02-04 01:03
8f174ffd446c456eaf3cca0915d0368d    free    2018-02-03 15:43
8f174ffd446c456eaf3cca0915d0368d    enroute 2018-02-03 17:02

3 столбца: driver_id, status, dttm

Что мне нужно сделать, это сгруппировать по идентификатору драйвера и составить список всех статусов сих соответствующие значения dttm в новый столбец с именем 'driver_info':

driver_id                           driver_info
9f8f9bf3ee8f4874873288c246bd2d05    [("free", 2018-02-04 00:19), ("busy", 2018-02-04 01:03)]
8f174ffd446c456eaf3cca0915d0368d    [("free", 2018-02-03 15:43), ("enroute", 2018-02-03 17:02) ...]

Как мне это сделать в Python 3?

Я пытался

dfg = df.groupby("driver_id").apply(lambda x: pd.concat((x["status"], x["dttm"])))

, но результатотличается от того, что я ожидаю, что это будет ...

Ответы [ 2 ]

2 голосов
/ 24 апреля 2019

Используйте GroupBy.apply с list и zip для списка кортежей:

df1 = (df.groupby('driver_id')
         .apply(lambda x: list(zip(x['status'], x['dttm'])))
         .reset_index(name='driver_info'))
print (df1)
                          driver_id  \
0  8f174ffd446c456eaf3cca0915d0368d   
1  9f8f9bf3ee8f4874873288c246bd2d05   

                                         driver_info  
0  [(free, 2018-02-03 15:43), (enroute, 2018-02-0...  
1  [(free, 2018-02-04 00:19), (busy, 2018-02-04 0...  
2 голосов
/ 24 апреля 2019

try: используя zip и apply (список)

df['driver_info'] = list(zip(df['status'], df['dttm']))
df = df.groupby('driver_id')['driver_info'].apply(list)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...