对每组groupby熊猫内的计数值进行排序

时间:2019-10-26 19:16:05

标签: python pandas sorting group-by aggregate

我有一个数据框,其中我根据两列对数据进行了分组,并使用count函数进行了汇总。现在,我希望每个组的计数都按顺序排列。

>>> df = pd.DataFrame([[1.1, 1.1, 1.1, 2.6, 2.5, 3.4,2.6,2.6,3.4,3.4,2.6,1.1,1.1,3.3], list('AAABBBBABCBDDD'), [1.1, 1.7, 2.5, 2.6, 3.3, 3.8,4.0,4.2,4.3,4.5,4.6,4.7,4.7,4.8], ['x/y/z','x/y/z','x/y/z','x/u','x/u','x/u/v','x/y/z','x','x/u/v/b','-','x/y/z','x','x','x/u/v/w'],['1','3','3','2','4','2','5','3','6','3','5','1','1','1']]).T
>>> df.columns = ['col1','col2','col3','col4','col5']
>>> df1 = df[['col2', 'col1', 'col4']].groupby(['col2', 'col4']).agg('count')
>>> df1
              col1
col2 col4
A    x           1
     x/y/z       3
B    x/u         2
     x/u/v       1
     x/u/v/b     1
     x/y/z       2
C    -           1
D    x           2
     x/u/v/w     1

预期输出:

col2 col4        col1
A    x/y/z       3
     x           1
B    x/u         2
     x/y/z       2
     x/u/v       1
     x/u/v/b     1
C    -           1
D    x           2
     x/u/v/w     1
您看到的

是每个组的排序顺序。这是我尝试过的。

>>> df1 = df[['col1', 'col2', 'col4']].groupby(['col2', 'col4']).agg('count').sort_index(0, ascending=False)
>>> df1
              col1
col2 col4
D    x/u/v/w     1
     x           2
C    -           1
B    x/y/z       2
     x/u/v/b     1
     x/u/v       1
     x/u         2
A    x/y/z       3
     x           1

如何根据计数对组进行排序?

3 个答案:

答案 0 :(得分:2)

这有点涉及,但是作为第二步,您可以按第一级分组并按降序对每个组进行排序:

(df1.groupby(level=0, group_keys=False)
    .apply(lambda x: x.sort_values('col1', ascending=False)))

              col1
col2 col4         
A    x/y/z       3
     x           1
B    x/u         2
     x/y/z       2
     x/u/v       1
     x/u/v/b     1
C    -           1
D    x           2
     x/u/v/w     1

答案 1 :(得分:2)

您只需要按col2的升序和count的降序进行排序,例如:

result = df1.sort_values(by=['col2', 'col1'], ascending=[True, False])
print(result)

输出

              col1
col2 col4     

A    x/y/z       3
     x           1
B    x/u         2
     x/y/z       2
     x/u/v       1
     x/u/v/b     1
C    -           1
D    x           2
     x/u/v/w     1

替代方法可能是:

result = df1.assign(reverse=df1.col1*-1).sort_values(by=['col2', 'reverse']).drop('reverse', axis=1)

答案 2 :(得分:2)

您可以按多个列以多种顺序进行排序:

df[['col2', 'col1', 'col4']].groupby(['col2', 'col4']).count() \
    .sort_values(['col2', 'col1'], ascending=[True, False])