[英]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.