代码之家  ›  专栏  ›  技术社区  ›  user3768495

pandas groupby然后聚合结果顺序不可重复?

  •  0
  • user3768495  · 技术社区  · 6 年前

    这是我的密码:

    import pandas as pd
    df = pd.DataFrame({'id': ['a', 'a', 'b', 'b', 'b'],
                       'v1': [1, 2, 3 ,4, 5],
                       'v2': [7, 6, 5, 4, 3],
                       'v3': [2, 4, 6, 8, 10]})
    
    df.groupby('id').agg({'v1': ['count', 'sum'],
                          'v2': 'mean',
                          'v3': 'sum'})
    

    我的问题是,每次我运行这段代码(在jupyter笔记本中),生成的数据帧都有不同的列顺序。这是熊猫身上的虫子吗?

    顺便说一句,我使用的是python 3.5和pandas 0.23.0。

    2 回复  |  直到 6 年前
        1
  •  3
  •   sacuL    6 年前

    当我多次运行代码时,不会得到不同的排序。然而,如果您遇到这个问题,您可以根据您的订单命名您想要的订单 agg . 例如,如果您想要订单 v2 v3 , v1 ,请:

    df.groupby('id',sort=False).agg({'v1': ['count', 'sum'],
                          'v2': 'mean',
                          'v3': 'sum'})[['v2','v3','v1']]
    
         v2  v3    v1    
       mean sum count sum
    id                   
    a   6.5   6     2   3
    b   4.0  24     3  12
    

    或者,如果您只是想要与原始数据帧相同的顺序:

    df.groupby('id',as_index=False).agg({'v1': ['count', 'sum'],
                                         'v2': 'mean',
                                         'v3': 'sum'})[df.columns]
    
      id    v1       v2  v3
         count sum mean sum
    0  a     2   3  6.5   6
    1  b     3  12  4.0  24
    

    但总而言之,@Allolz的评论在我看来最有意义,使用 sort_index(1) :

    df.groupby('id').agg({'v1': ['count', 'sum'],
                          'v2': 'mean',
                          'v3': 'sum'}).sort_index(1)
    
        2
  •  0
  •   jeschwar    6 年前

    dict Python3.5中没有对键进行排序;这适用于 字典 pd.DataFrame() .agg() OrderedDict collections 模块,或者您可以使用 DataFrame.reindex()

    import pandas as pd
    df = pd.DataFrame({
        'id': ['a', 'a', 'b', 'b', 'b'],
        'v1': [1, 2, 3 ,4, 5],
        'v2': [7, 6, 5, 4, 3],
        'v3': [2, 4, 6, 8, 10]
    })
    
    df = df.set_index('id')
    df = df.reindex(columns=['v1', 'v2', 'v3'])
    
    df.groupby(level='id').agg({
        'v1': ['count', 'sum'],
        'v2': 'mean',
        'v3': 'sum'
    })
    

    DataFrame.reindex() DataFrame.sort_index() .