【问题标题】:How to sort rows within a group (in descending order) using pandas如何使用熊猫对组内的行进行排序(按降序排列)
【发布时间】:2021-04-02 15:07:13
【问题描述】:

我有一个如下的数据框:

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]....]]。我不希望每个元素本身都是一个列表。如何反转订单?任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: python pandas pandas-groupby


    【解决方案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']
    

    响应 cmets 中的请求:

    现在我想将这些 col2 值与 col1 值结合起来,可以吗? 直接从 dummy 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]
    

    【讨论】:

    • 非常感谢您的帮助。我刚刚查询了一个,得到col2的排序值后,我可以直接将这些值与col1关联吗?意思是,现在我想将这些 col2 值与 col1 值结合起来,我可以直接从 dummy df 中获取 col1 并排序 col2 以创建一个新的数据帧吗?
    • @Aditya 我不关注,抱歉。你的意思是你想得到对应于排序 col2 值的 col1 值吗?输出应该是什么样的,元组列表?
    • @ca95 输出应该看起来像(例如): 1 [c,b,a] 2 [e,d,f] ...
    【解决方案2】:

    试试:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-19
      • 2012-08-21
      • 2013-10-09
      • 2022-01-06
      • 2014-02-16
      • 2021-11-19
      相关资源
      最近更新 更多