Pandas将数据框分组并按列值排序

时间:2016-07-08 12:49:45

标签: python pandas

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

        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

1 个答案:

答案 0 :(得分:2)

<强> UPDATE2:

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

OLD回答:

FirstOrDefault