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

pandas groupby然后聚合结果顺序不可重复?,pandas,aggregate,python-3.5,pandas-groupby,Pandas,Aggregate,Python 3.5,Pandas Groupby,这是我的密码: 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', 'su

这是我的密码:

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


谢谢

当我多次运行代码时,不会得到不同的顺序。但是,如果遇到此问题,可以在
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的评论在我看来是最有意义的,它使用了
排序索引(1)


当我多次运行代码时,不会得到不同的排序。但是,如果遇到此问题,可以在
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的评论在我看来是最有意义的,它使用了
排序索引(1)


dict
键在Python 3.5中没有排序;这适用于代码中的
pd.DataFrame()
.agg()
中使用的
dict
s。您可以使用Python标准库中的
collections
模块中的
orderedict
,也可以使用
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\u index()
dict
键在Python3.5中没有顺序;这适用于代码中的
pd.DataFrame()
.agg()
中使用的
dict
s。您可以使用Python标准库中的
collections
模块中的
orderedict
,也可以使用
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\u index()

字典在Python 3.7中排序。我认为添加
.sort\u index(1)
应该确保列的排序方式始终相同。字典在Python3.7中排序。也许可以换成那样?我认为添加
.sort\u index(1)
可以确保您的列总是以相同的方式排序。我最喜欢第一种方法,因为我可以完全控制我想要的顺序。谢谢@sacul。我最喜欢第一种方法,因为我可以随心所欲地完全控制订单。谢谢@sacul。