1

我有一个数据框如下:

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)

因此,数据框如下所示:

虚拟数据

我想根据 col1 对所有值进行分组,并根据 col3 的排序(递减顺序)获取 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]....]]。我不希望每个元素本身都是一个列表。如何反转订单?任何帮助将不胜感激。谢谢你。

4

2 回答 2

1

这里不需要使用 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']

回应评论中的要求:

现在我想将这些 col2 值与 col1 值结合起来,我可以直接从虚拟 df 中获取 col1 并排序 col2 以创建一个新的数据帧吗?

输出应如下所示(例如): 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]
于 2020-12-24T03:38:23.150 回答
1

尝试:

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()

于 2020-12-24T03:47:54.830 回答