熊猫GroupBy和sort_values不能按预期工作

时间:2019-03-15 14:14:25

标签: pandas sorting group-by

我有包含列的数据集:

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 个答案:

答案 0 :(得分:1)

我认为您需要按多个列进行排序,但是首先将列time转换为日期时间:

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'])

编辑:

测试了两个解决方案,工作原理相同:

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