Pandas Groupby - нет объектов для объединения - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть Dataframe со следующими значениями:

    df = 
route    stop_code      stop_name
900      92072          Eastbound @ 257 Kingston Road East   
900      1590           Kingston Westbound @ Wicks   
900      2218           Kingston Eastbound @ Wicks   
900      93152          Salem Northbound @ Kingston   
92       728            Kingston Rd. @ Salem Rd.   
224      92071          Salem Southbound @ Twilley   
215      92071          Salem Southbound @ Twilley   
215      92054          Northbound @ 133 Salem   
224      92054          Northbound @ 133 Salem   
215      93152          Salem Northbound @ Kingston   

Я хочу сгруппировать маршруты по stop_code или stop_name, что-то вроде:

df2 = 
    route         stop_code      stop_name
    900           92072          Eastbound @ 257 Kingston Road East   
    900           1590           Kingston Westbound @ Wicks   
    900           2218           Kingston Eastbound @ Wicks   
    92            728            Kingston Rd. @ Salem Rd.   
    224, 215      92071          Salem Southbound @ Twilley   
    215, 215      92054          Northbound @ 133 Salem   
    215, 900      93152          Salem Northbound @ Kingston 

Я пытался сделать следующее :

df2 = df.groupby(['stop_code']).agg(set).reset_index()

, хотя он отлично работал в моей тестовой среде, когда я развернул его в Django (Python Anywhere), я получил следующую ошибку (возможно, из-за разных версий Pandas / Python / Django):

ValueError: No objects to concatenate

Может кто-нибудь помочь мне разобраться? ТИА

1 Ответ

0 голосов
/ 28 февраля 2020

Вы можете сделать это следующим образом

df.groupby(['stop_code','stop_name'],sort=False)['route'].agg(list).reset_index()

Вывод

  stop_code stop_name                           route
0   92072   Eastbound @ 257 Kingston Road East  [900]
1   1590    Kingston Westbound @ Wicks          [900]
2   2218    Kingston Eastbound @ Wicks          [900]
3   93152   Salem Northbound @ Kingston         [900, 215]
4   728     Kingston Rd. @ Salem Rd.            [92]
5   92071   Salem Southbound @ Twilley          [224, 215]
6   92054   Northbound @ 133 Salem              [215, 224]

Если вы хотите точно так же, как и в ожидаемом результате, сделайте, как показано ниже. Однако это, вероятно, будет медленнее.

df.groupby(['stop_code','stop_name'],sort=False)['route'].apply(lambda x: ','.join([str(a) for a in x])).reset_index()

Вывод

 stop_code  stop_name                            route
0   92072   Eastbound @ 257 Kingston Road East   900
1   1590    Kingston Westbound @ Wicks           900
2   2218    Kingston Eastbound @ Wicks           900
3   93152   Salem Northbound @ Kingston          900,215
4   728     Kingston Rd. @ Salem Rd.             92
5   92071   Salem Southbound @ Twilley           224,215
6   92054   Northbound @ 133 Salem               215,224
...