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

如何按两列或多列对python中的数据帧进行排序?

柯曜文
2023-03-14

假设我有一个包含列abc数据帧,我想按升序按列b排序,按降序按列c排序,如何我要这么做吗?

共有3个答案

金子平
2023-03-14

对于数字数据的大数据帧,您可以通过使用键序列执行间接排序的numpy.lexsort看到显著的性能改进:

import pandas as pd
import numpy as np

np.random.seed(0)

df1 = pd.DataFrame(np.random.randint(1, 5, (10,2)), columns=['a','b'])
df1 = pd.concat([df1]*100000)

def pdsort(df1):
    return df1.sort_values(['a', 'b'], ascending=[True, False])

def lex(df1):
    arr = df1.values
    return pd.DataFrame(arr[np.lexsort((-arr[:, 1], arr[:, 0]))])

assert (pdsort(df1).values == lex(df1).values).all()

%timeit pdsort(df1)  # 193 ms per loop
%timeit lex(df1)     # 143 ms per loop

一个特点是,定义的排序顺序与numpy.lexsort是颠倒的:(-'b','a')排序系列a第一。我们否定系列b,以反映我们希望这个系列按降序排列。

请注意np。lexsort仅使用数值进行排序,而pd。数据帧。sort_值可用于字符串或数字值。使用np。带字符串的lexsort将给出:类型错误:一元数的操作数类型错误-:“str”

范文昌
2023-03-14

从熊猫0.17.0开始,DataFrame.sort()不建议使用,并设置为在熊猫的未来版本中删除。按数据帧的值排序的方法现在是DataFrame.sort_values

因此,你的问题现在的答案是

df.sort_values(['b', 'c'], ascending=[True, False], inplace=True)
茹正祥
2023-03-14

从0.17开始。0版本中,sort方法被弃用,取而代之的是sort\u值<代码>排序在0.20中被完全删除。0版本。参数(和结果)保持不变:

df.sort_values(['a', 'b'], ascending=[True, False])

您可以使用排序的升序参数

df.sort(['a', 'b'], ascending=[True, False])

例如:

In [11]: df1 = pd.DataFrame(np.random.randint(1, 5, (10,2)), columns=['a','b'])

In [12]: df1.sort(['a', 'b'], ascending=[True, False])
Out[12]:
   a  b
2  1  4
7  1  3
1  1  2
3  1  2
4  3  2
6  4  4
0  4  3
9  4  3
5  4  1
8  4  1

由@renadeen评论

默认情况下,排序不到位!所以,您应该将sort方法的结果分配给一个变量,或者将inplace=True添加到方法调用中。

也就是说,如果要将df1重新用作已排序的数据帧:

df1 = df1.sort(['a', 'b'], ascending=[True, False])

df1.sort(['a', 'b'], ascending=[True, False], inplace=True)
 类似资料:
  • 问题内容: 假设我有一个数据列,其中包含,和,我想按升序按列对数据帧进行排序,然后按降序按列对数据帧进行排序,我该怎么做? 问题答案: 从0.17.0版开始,不推荐使用该方法,而推荐使用。 sort在0.20.0版本中被完全删除。参数(和结果)保持不变: 你可以使用的升序参数sort: 例如: 如@renadeen所评论 默认情况下,排序不正确!因此,你应该将方法的结果分配给变量,或者将添加到方法

  • 我想按多个列对熊猫数据框进行分组。每个Row都有一个整数、一个Name和一个额外的数值。我希望最终的Dataframe包含Name具有最高整数的每一行。 通过分组数据帧,只有第0行应该消失。第3行和第4行仍应包括在数据框中。

  • 问题内容: 我有一个从排序的csv创建的以下列表 我实际上想按两个条件对列表进行排序:首先按字段1中的值,然后按字段2中的值。我该怎么做? 问题答案: 像这样:

  • 我有一个像这样的数据框- 我有一个这样的列表- 现在,我想根据列名列表对数据框进行排序 因此,新的数据框将有列名称-

  • 问题内容: 我有一个清单清单: 如果要按一个元素(例如,高/短元素)排序,可以通过进行。 如果我想作为排序依据两个高大和颜色,我可以为每个元素做排序两次,一次,但有一个更快的方法? 问题答案: 键可以是返回元组的函数: 或者,你可以使用来实现相同的效果(速度更快,并且避免了Python函数调用): 并请注意,你可以在此处使用而不是使用,然后重新分配:

  • 若要用单个列过滤数据文件(DF),如果我们考虑有男性和女性的数据,我们可以: 问题1——但如果数据跨越多年,而我只想看到2014年的男性会怎样? 在其他语言中,我可能会这样做: (除非我想这样做并在新的dataframe对象中获取原始dataframe的子集) 问题2。我如何在一个循环中实现这一点,并为每个独特的年份和性别集(即:2013年男性、2013年女性、2014年男性和2014年女性)创建