有没有可能对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
如何根据以下“规则”对上面的df
DataFrame对象进行排序?
更实际地说,我要找的结果是这样的:
# 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"]
。
您可以使用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布局 我想实现排序功能,在那里用户可以排序公司名称升序和降序,我如何实现它?