繁体   English   中英

熊猫分组数据框并按列值排序

[英]Pandas group data frame and sort by column value

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

        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

UPDATE2:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM