通读后:http://pandas.pydata.org/pandas-docs/version/0.13.1/generated/pandas.DataFrame.sort.html
我似乎仍然想不出如何按自定义列表对列进行排序。显然,默认排序是按字母顺序排序的。我来举个例子。以下是我的(非常简短的)数据框架:
Player Year Age Tm G
2967 Cedric Hunter 1991 27 CHH 6
5335 Maurice Baker 2004 25 VAN 7
13950 Ratko Varda 2001 22 TOT 60
6141 Ryan Bowen 2009 34 OKC 52
6169 Adrian Caldwell 1997 31 DAL 81
我希望能够按照球员、年份和TM进行排序。按球员和年份的默认排序对我来说很好,按正常顺序排序。然而,我不希望球队按字母顺序B/C排序,我希望球队总是排在最前面。
以下是我创建的列表:
sorter = ['TOT', 'ATL', 'BOS', 'BRK', 'CHA', 'CHH', 'CHI', 'CLE', 'DAL', 'DEN',
'DET', 'GSW', 'HOU', 'IND', 'LAC', 'LAL', 'MEM', 'MIA', 'MIL',
'MIN', 'NJN', 'NOH', 'NOK', 'NOP', 'NYK', 'OKC', 'ORL', 'PHI',
'PHO', 'POR', 'SAC', 'SAS', 'SEA', 'TOR', 'UTA', 'VAN',
'WAS', 'WSB']
在阅读了上面的链接后,我以为这会起作用,但它没有:
df.sort(['Player', 'Year', 'Tm'], ascending = [True, True, sorter])
它的顶部仍然有ATL,这意味着它是按字母顺序排序的,而不是按照我的自定义列表排序的。任何帮助都是非常感谢的,我只是想不通。
9条答案
按热度按时间ef1yzkbh1#
下面的答案是一个古老的答案。它现在还能用。无论如何,已经发布了另一个非常优雅的解决方案(如下所示),使用
key
参数。我刚刚发现Pandas15.1可以用范畴序列(https://pandas.pydata.org/docs/user_guide/categorical.html)
对于您的示例,让我们定义相同的 Dataframe 和排序器:
有了 Dataframe 和分类器,这是一个分类顺序,我们可以在Pandas15.1中做以下事情:
yruzcnhs2#
下面是一个对 Dataframe 执行词典排序的示例。其想法是基于特定的排序创建一个数字索引。然后根据索引执行数值排序。为此,在 Dataframe 中添加一列,然后将其删除。
t98cgbkg3#
q9yhzks04#
根据Pandas 1.1.0文档,可以使用
key
参数进行排序,就像在sorted
函数中一样(终于!)下面是我们如何按Tm
进行排序遗憾的是,我们似乎只能在按1列排序时使用此功能(不接受包含
key
s的列表)。它可以通过groupby
来规避如果你知道如何使用
sort_values
中的key
,请告诉我sy5wg1nm5#
这几行代码就完成了这项工作
bxpogfeg6#
当您需要按单个定制列表排序时,将索引设置为
DataFrame.loc
非常有用。因为loc
将为sorter
中不在DataFrame中的值创建NaN
行,所以我们将首先找到交叉点。这可以防止任何不必要的向上投射。任何值不在列表中的行都将被删除。起始数据:
oug3syen7#
从1.1.0版开始,您可以使用
key
属性对值进行排序:vc6uscn98#
仅对按分类列排序感兴趣的用户的部分解决方案:
您可以使用从定制列表创建排序顺序Map器的帮助器函数来实现这一点。
此示例仅包括一列中的值,但是可以通过创建包含所有列中出现的值的自定义顺序列表来扩展它以包括其他列。自然,由于您必须在排序字段中使用所有可能的值构建自定义列表,所以这主要适用于分类排序,而不适合连续变量(除非事先知道可能的值)和基数非常高的列。
使用OP的数据:
a0x5cqrl9#
我的想法是根据索引生成排序号,然后将排序号合并到原始 Dataframe 中