Pandas GroupBy и sort_values ​​не работают должным образом - PullRequest
1 голос
/ 15 марта 2019

У меня есть набор данных, который имеет столбцы:

Unnamed: 0         int64
id                object
number_from       object
number_to         object
time              object

И я применил к нему эту функцию: data1.groupby('number_from').apply(lambda x: x.sort_values('time'))

Я получаю что-то вроде этого:

Unnamed   id     number_from  number_to       time
17699  d20b3e          934           674  2017-07-03 06:36:20.000  
17700  d20b81          934           674  2017-07-03 06:36:22.000  
17701  d20b96          934           674  2017-07-03 06:36:23.000  
**17703  d20c17        612           235  2017-07-03 06:36:28.000**  
17707  d20db5          934           658  2017-07-03 06:36:45.000  
17708  d20de9          934           658  2017-07-03 06:36:47.000  
17710  d20e05          934           658  2017-07-03 06:36:49.000  
17711  d20e41          934           658  2017-07-03 06:36:51.000  
17712  d20e73          934           658  2017-07-03 06:36:53.000 
17713  d20ecc          934           702  2017-07-03 06:36:57.000  
17714  d20ef1          934           702  2017-07-03 06:36:59.000 
17715  d20f32          934           702  2017-07-03 06:37:01.000  
17716  d20f77          934           702  2017-07-03 06:37:03.000  
17717  d20f8d          934           702  2017-07-03 06:37:05.000 
17718  d20fd8          934           262  2017-07-03 06:37:08.000 
17719  d21017          934           262  2017-07-03 06:37:11.000  
17720  d21032          934           262  2017-07-03 06:37:12.000  
17721  d2103e          934           262  2017-07-03 06:37:13.000  
17722  d2106d          934           262  2017-07-03 06:37:15.000
**17723  d210c4        396           048  2017-07-03 06:37:19.000** 
17725  d21147          934           691  2017-07-03 06:37:24.000  
17726  d21167          934           691  2017-07-03 06:37:26.000 

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

И я хочу сгруппировать и отсортировать значения времени в каждой группе независимо от других.

Я также пытался data1.sort_values(['time'], ascending=False).groupby('number_from'), но результат тот же. Что я делаю не так?

1 Ответ

1 голос
/ 15 марта 2019

Я считаю, что вам нужно отсортировать по нескольким столбцам вместе, но сначала преобразуйте столбец time в datetime:

data1['time'] = pd.to_datetime(data1['time'])
#if need to compare integers
data1['number_from'] = data1['number_from'].astype(int)

data1.sort_values(['number_from','time'])

EDIT:

Проверено оба решения, работающие одинаково:

data1['time'] = pd.to_datetime(data1['time'])

df1 = data1.sort_values(['number_from','time'])
print (df1)
             id  number_from  number_to                time
Unnamed                                                    
17723    d210c4          396         48 2017-07-03 06:37:19
17703    d20c17          612        235 2017-07-03 06:36:28
17699    d20b3e          934        674 2017-07-03 06:36:20
17700    d20b81          934        674 2017-07-03 06:36:22
17701    d20b96          934        674 2017-07-03 06:36:23
17707    d20db5          934        658 2017-07-03 06:36:45
17708    d20de9          934        658 2017-07-03 06:36:47
17710    d20e05          934        658 2017-07-03 06:36:49
17711    d20e41          934        658 2017-07-03 06:36:51
17712    d20e73          934        658 2017-07-03 06:36:53
17713    d20ecc          934        702 2017-07-03 06:36:57
17714    d20ef1          934        702 2017-07-03 06:36:59
17715    d20f32          934        702 2017-07-03 06:37:01
17716    d20f77          934        702 2017-07-03 06:37:03
17717    d20f8d          934        702 2017-07-03 06:37:05
17718    d20fd8          934        262 2017-07-03 06:37:08
17719    d21017          934        262 2017-07-03 06:37:11
17720    d21032          934        262 2017-07-03 06:37:12
17721    d2103e          934        262 2017-07-03 06:37:13
17722    d2106d          934        262 2017-07-03 06:37:15
17725    d21147          934        691 2017-07-03 06:37:24
17726    d21167          934        691 2017-07-03 06:37:26

Добавлен параметр group_keys=False), чтобы избежать создания уровня из столбца number_from:

df2 = data1.groupby('number_from', group_keys=False).apply(lambda x: x.sort_values('time'))
print (df2)
             id  number_from  number_to                time
Unnamed                                                    
17723    d210c4          396         48 2017-07-03 06:37:19
17703    d20c17          612        235 2017-07-03 06:36:28
17699    d20b3e          934        674 2017-07-03 06:36:20
17700    d20b81          934        674 2017-07-03 06:36:22
17701    d20b96          934        674 2017-07-03 06:36:23
17707    d20db5          934        658 2017-07-03 06:36:45
17708    d20de9          934        658 2017-07-03 06:36:47
17710    d20e05          934        658 2017-07-03 06:36:49
17711    d20e41          934        658 2017-07-03 06:36:51
17712    d20e73          934        658 2017-07-03 06:36:53
17713    d20ecc          934        702 2017-07-03 06:36:57
17714    d20ef1          934        702 2017-07-03 06:36:59
17715    d20f32          934        702 2017-07-03 06:37:01
17716    d20f77          934        702 2017-07-03 06:37:03
17717    d20f8d          934        702 2017-07-03 06:37:05
17718    d20fd8          934        262 2017-07-03 06:37:08
17719    d21017          934        262 2017-07-03 06:37:11
17720    d21032          934        262 2017-07-03 06:37:12
17721    d2103e          934        262 2017-07-03 06:37:13
17722    d2106d          934        262 2017-07-03 06:37:15
17725    d21147          934        691 2017-07-03 06:37:24
17726    d21167          934        691 2017-07-03 06:37:26

print (df1.equals(df2))
True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...