【问题标题】:Pandas group data frame and sort by column valuePandas 分组数据框并按列值排序
【发布时间】:2016-07-08 22:19:37
【问题描述】:

我正在尝试对数据框进行分组,同时按某列的绝对值对其进行排序。

        groups values foo bar
75       A      3      1   2
77       B     -3      31  34
112      A      4      0   4
129      C      50     5   3
134      C     -60     44  5

在我可以使用的整个数据框上

df.reindex(df.values.abs().sort_values(ascending=False).index)

这工作得很好。但是,对于分组数据框,这显然是行不通的。

当我尝试时,

df.groupby('groups')['values'].reindex(df.values.abs().sort_values(ascending=False).index)

我得到了预期的错误:

AttributeError: Cannot access callable attribute 'reindex' of 'SeriesGroupBy' objects, try using the 'apply' method

尝试apply 可能需要为绝对值创建另一列,但我不想添加此列。有没有一种巧妙的方法来实现它?

所需的输出将是为值列排序的分组数据框(对象):

   for groups, data in df_grouped:
        print group, data
A,
       values foo bar
75      3      1   2
112     4      0   4
B,
       values foo bar
77      -3     31  34
C,
       values foo bar
134     -60    44  5
129     50     5   3

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    更新 2:

    In [433]: for g,x in grp:
       .....:     print(g, x)
       .....:
    A     groups  values  foo  bar
    112      A       4    0    4
    77       A       3    1    2
    B    groups  values  foo  bar
    77      B      -3   31   34
    C     groups  values  foo  bar
    134      C     -60   44    5
    129      C      50    5    3
    

    更新:准备分组:

    In [428]: grp = (df.assign(abs_val=df['values'].abs())
       .....:          .sort_values(['groups','abs_val'], ascending=[1,0])
       .....:          .drop('abs_val', 1)
       .....:          .groupby('groups'))
    
    In [429]: grp.agg({'foo': ['first','last'], 'bar': ['min','mean','max']})
    Out[429]:
             foo      bar
           first last min mean max
    groups
    A          0    1   2    3   4
    B         31   31  34   34  34
    C         44    5   3    4   5
    

    旧答案:

    In [393]: df.assign(abs_val=df['values'].abs()).sort_values(['groups','abs_val'], ascending=[1,0]).drop('abs_val', 1)
    Out[393]:
        groups  values
    112      A       4
    77       A       3
    77       B      -3
    134      C     -60
    129      C      50
    

    【讨论】:

    • 排序是正确的,但我想返回一个分组的数据框,以便进一步处理数据。
    • 查看我编辑的问题以获得预期的输出。谢谢@MaxU
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 2021-11-04
    • 1970-01-01
    • 2021-05-03
    • 2015-12-31
    • 2019-04-15
    相关资源
    最近更新 更多