如何使用pandas对组内的行进行排序(降序)

2024-03-28 11:55:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧,如下所示:

col1=[1,1,1,2,2,2,3,3,3]
col2=['a','b','c','d','e','f','g','h','i']
col3=[1,2,3,2,3,1,3,1,2]
d={
    "col1":col1,
    "col2":col2,
    "col3":col3
}
dummy= pd.DataFrame(d)

因此,数据框如下所示:

dummy data

我想根据col1对所有值进行分组,并根据col3的排序(递减ord)得到col2的值,即,我希望最终结果如下: col2=[c,b,a,e,d,f,g,i,h] 我已经尝试了以下方法,它们以升序排列在col2中:

res=dummy.groupby(['col1','col3'])['col2'].apply(sorted).reset_index()

但是上面的结果是[[a]、[b]、[c]…]。我不希望每个元素本身都是一个列表。我如何颠倒顺序?任何帮助都将不胜感激。多谢各位


Tags: 数据方法dataframe排序rescol2col3col1
2条回答

这里不需要使用groupby,在两列上使用一个简单的sort_values就足够了:

dummy.sort_values(['col1', 'col3'], ascending=[True, False])

   col1 col2  col3
2     1    c     3
1     1    b     2
0     1    a     1
4     2    e     3
3     2    d     2
5     2    f     1
6     3    g     3
8     3    i     2
7     3    h     1

“col2”的顺序正确,您现在只需将其作为列表返回:

col2_list = (dummy.sort_values(['col1', 'col3'], ascending=[True, False])
                  .get('col2')
                  .tolist())

col2_list
# ['c', 'b', 'a', 'e', 'd', 'f', 'g', 'i', 'h']

针对评论中的请求:

now I want to combine these col2 values with col1 values, can I directly fetch col1 from dummy df and sorted col2 to create a new dataframe?

The output should look like (eg): 1 [c,b,a] 2 [e,d,f] ...

在这里,我们可以在前面的解决方案的基础上使用Groupby.agg来列出数据:

(dummy.sort_values(['col1', 'col3'], ascending=[True, False])
      .groupby('col1', sort=False)['col2']
      .agg(list)
      .reset_index())

   col1       col2
0     1  [c, b, a]
1     2  [e, d, f]
2     3  [g, i, h]

尝试:

df.groupby(['col1'])[['col2','col3']].apply(lambda x: x.sort_values('col3',ascending=False)).reset_index(drop=True)['col2']

印刷品:

0    c
1    b
2    a
3    e
4    d
5    f
6    g
7    i
8    h

要以列表形式打印,请使用series.tolist()

相关问题 更多 >