当前位置: 首页 > 知识库问答 >
问题:

如何在数据帧上进行条件排序(即根据另一列中的值在一列中进行升序和降序)?

松英喆
2023-03-14

有没有可能对Pandas DataFrame的行相对于多列进行排序,并将列中的一些行按升序排列,将其他行(同一列中的行)按降序排列?这里有一个我正在寻找的可重复的小例子:

import pandas as pd

df = pd.DataFrame(data={'class':['A','A','A','B','B','B','C','C','C'],
                        'val':[20,10,15,55, 75, 71,3,1,2],
                        'sub':['a','c','b','b','a','c','c','a','b']})

print(df)
# This is the original unsorted DataFrame
#  class  val sub
#0     A   20   a
#1     A   10   c
#2     A   15   b
#3     B   55   b
#4     B   75   a
#5     B   71   c
#6     C    3   c
#7     C    1   a
#8     C    2   b

如何根据以下“规则”对上面的dfDataFrame对象进行排序?

  • 第一优先级:按“类别”列按字母升序排序

更实际地说,我要找的结果是这样的:

# This is the sorted DataFrame that I'm trying to get
#  class  val sub
#1     A   10   c
#2     A   15   b
#0     A   20   a
#4     B   75   a
#5     B   71   c
#3     B   55   b
#7     C    1   a
#8     C    2   b
#6     C    3   c

有没有直接的方法可以做到这一点?

为了解决这个问题,我创建了一个额外的“排序”列,并操作其中的值,使它们在数字上都遵循升序。

df['val_temp'] = df.apply(lambda x: x['val'] if x['class'] in ['A','C'] else -x['val'], axis=1)

df.sort_values(by=['class','val_temp'], ascending=[True,True]).drop(columns='val_temp')

问题是这个解决方法看起来非常脏,对非数字值不起作用。例如,如果我想在"sub"列上进行第二优先级排序,我不知道如何继续。

熊猫是否提供了一个接口来实现这一点,还是我只需要依赖像上面这样的“肮脏”变通方法?

我已经看了这个线程和这个线程,但是它们只提供了一个基于数学的解决方案,就像我上面做的那样,当我们需要对字符串列进行排序时,它就不起作用了,比如df["sub"]

共有1个答案

董良策
2023-03-14

您可以使用GroupBy。应用和字典映射每组的排序顺序:

order = {'A': True, 'B': False, 'C': True}

(df.groupby('class', group_keys=False)
   .apply(lambda s: s.sort_values(by='val', ascending=order[s.name]))
 )

注意groupby默认情况下对组进行排序,因此隐式完成“类”排序

输出:

  class  val sub
1     A   10   c
2     A   15   b
0     A   20   a
4     B   75   a
5     B   71   c
3     B   55   b
7     C    1   a
8     C    2   b
6     C    3   c
 类似资料:
  • 如何按第一列升序和第二列降序对NumPy中的2d数组进行排序? 例如 结果:

  • 我看到过其他几个类似于这个问题的问题,但我还没有找到任何解决我的问题的方法。

  • 问题内容: 我有一个这样的字符串列表: 使用Y中的值对X进行排序以获取以下输出的最短方法是什么? 具有相同“键”的元素的顺序无关紧要。我可以求助于for结构的使用,但我好奇是否有更短的方法。有什么建议么? 问题答案: 最短代码 例: 一般来说 解释: 两个。 创建一个新的,list基于zip使用排序sorted()。 使用列表推导从排序的,压缩的中提取每对的第一个元素list。

  • 问题内容: 嗨,我正在尝试读取未排序的文件,并让Java对CSV数据文件的一列进行排序,并将这些结果打印到新文件中。我在此网站上搜索时借用了该解决方案,因为我认为这对我想要完成的工作非常理想。我有282行数据,形式为 这是在csv文件中。当我使用上面的代码时,它在sorted_marks.txt中只给我一行,就像这样 我相信它甚至都没有排序。 我希望将新文件中的所有结果根据其用户ID排序,但没有别

  • 我有98000个美国家庭街道地址,我需要按照“步行”的顺序进行排序,也就是说,按照你要走的顺序,沿着街道的一侧走,然后穿过街道往回走。 所需的df结果,对奇数街道编号进行升序排序,然后对偶数街道编号切换到降序排序。[抱歉,第一个问题,还没有资格复制Jupyter笔记本的图像] 4列:数字、街道、城镇、偶数 “编号”列的预期结果:1231 1233 1235 1237 1239 1238 1236

  • 下面列出XML布局 我想实现排序功能,在那里用户可以排序公司名称升序和降序,我如何实现它?