【问题标题】:Pandas GroupBy and sort_values don't work as expectedPandas GroupBy 和 sort_values 无法按预期工作
【发布时间】:2019-08-06 15:35:20
【问题描述】:

我有包含列的数据集:

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'),但结果是一样的。我做错了什么?

【问题讨论】:

    标签: pandas sorting group-by


    【解决方案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
    

    【讨论】:

    • 但我也需要有一个组,因为我稍后会单独处理每个组。所以这行: data1.sort_values(['number_from','time'], ascending=False).groupby('number_from') 会起作用吗? :D
    • @Neven - 它是另一种选择 - 首先 'group' 通过第一个排序列然后按另一个排序。
    • @Neven - 我认为是的,对于 100% 肯定没有更改的组是可能的使用 data1.sort_values(['number_from','time'], ascending=False).groupby('number_from', sort=False)
    • @Neven - 转换为日期时间也是必要的,只是添加到答案中。
    • 现在可以了。 :))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    • 2013-12-23
    • 2014-12-09
    • 2016-01-13
    相关资源
    最近更新 更多