【问题标题】:pandas groupby then aggregate results order not repeatable?pandas groupby 然后聚合结果顺序不可重复?
【发布时间】:2019-05-03 01:39:10
【问题描述】:

这是我的代码:

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 notebook 中)时,生成的数据框都有不同的列顺序。这是熊猫的错误​​吗?

我的下一步是重命名生成的数据框,但没有可重现的顺序,编写可重用的代码来做到这一点是不可能的。我该如何解决?

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

谢谢!

【问题讨论】:

  • 字典在 Python 3.7 中排序。也许切换到那个?
  • 我认为添加 .sort_index(1) 应该确保您的列始终以相同的方式排序。

标签: pandas aggregate python-3.5 pandas-groupby


【解决方案1】:

当我多次运行代码时,我没有得到不同的排序。但是,如果您遇到这个问题,您可以在agg 之后命名您想要的订单。例如,如果您想要v2v3v1 的顺序,请执行以下操作:

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 的评论是最有意义的 IMO,使用 sort_index(1)

df.groupby('id').agg({'v1': ['count', 'sum'],
                      'v2': 'mean',
                      'v3': 'sum'}).sort_index(1)

【讨论】:

  • 我最喜欢第一种方法,因为我可以完全控制我想要的顺序。谢谢@sacul。
【解决方案2】:

dict 键在 Python 3.5 中没有排序;这适用于代码中pd.DataFrame().agg() 中使用的dicts。您可以使用 Python 标准库中 collections 模块中的 OrderedDict,也可以使用 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() 更通用。

【讨论】:

    猜你喜欢
    • 2020-03-07
    • 1970-01-01
    • 2021-11-05
    • 2016-02-09
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    • 2014-11-23
    • 2017-07-04
    相关资源
    最近更新 更多