繁体   English   中英

按字符串列表对 python 中的数据框进行排序,其中包含重复项

[英]Sort a data frame in python with duplicates by a string list

我有一个包含 250 个名称的数据框,其值通过 pandas read_csv 在 python 中导入。 它读入数据:

姓名 val1 val2 val3
乔治 2.5 1.1 1.0
乔治 3.1 1.4 0.0
乔治 1.1 0.9 4.1
汤姆 2.1 1.2 -3.0
汤姆 3.0 -1.2 3.5
汤姆 7.3 5.2 -1.2
汤姆 0.1 0.1 0.1
... ... ... ...
莎莉 6.1 9.1 -5.6
莎莉 5.7 4.7 9.1

我想按特定顺序重新排序:

neworder = ['Sally', ..., 'George', 'Tom']
姓名 val1 val2 val3
莎莉 6.1 9.1 -5.6
莎莉 5.7 4.7 9.1
... ... ... ...
乔治 2.5 1.1 1.0
乔治 3.1 1.4 0.0
乔治 1.1 0.9 4.1
汤姆 2.1 1.2 -3.0
汤姆 3.0 -1.2 3.5
汤姆 7.3 5.2 -1.2
汤姆 0.1 0.1 0.1

在 IDL 中,我会使用一些for循环来执行此操作,但我怀疑 Python 中的排序 function 是我的谷歌技能无法找到的。

以某种方式为您的排序创建一个查找字典:

name_order = {'Sally':1, ... , 'George':12, 'Tom':13} # hand-numbered
neworder = ['Sally', ... , 'George', 'Tom']
name_order = {nm:ix for ix,nm in enumerate(neworder)} # generated

然后将它传入一个 lambda function 给关键参数:

df.sort_values(by='name', key=lambda nm: nm.map(name_order))

如果出现意外的名字,我需要考虑一下会发生什么; 您可以通过将name_order collections.defaultdict来解决此问题。

这是解决方案

neworder = ['Sally', ... , 'George', 'Tom']
name_order = {nm:ix for ix,nm in enumerate(neworder)} # generated
df.sort_values(by='name', key=lambda nm: nm.map(name_order))

谢谢@Joffan 和@ShubhamSharma

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM