我有一个数据框,其中我根据两列对数据进行了分组,并使用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
如何根据计数对组进行排序?
答案 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])