1.能解决什么问题?

当我们在Python环境下,对含有数字的字符串列表进行排序时,往往会遇到无法正常排序的问题。构建演示案例如下:

num_list=['1','8','12','20','7','16','a1','a4','a10','a5','a23']

列表截图:

python NaN 怎么用 python nat_python NaN 怎么用


利用内置的排序函数sorted进行排序,代码如下:

sorted(num_list)

其排序结果,见下图:

python NaN 怎么用 python nat_字符串排序_02


通过上面的例子,我们可以发现对含有数字形式的字符串在利用内置的排序函数sorted排序时,无法对其进行正常的排序。

2.如何解决?

为解决上述的问题,可以通过以下代码解决:

import natsort as ns
ns.natsorted(num_list)

运行以上代码,得出以下结果:

python NaN 怎么用 python nat_数据清洗_03


如果我们想进行倒序排序,可以进行以下操作:

import natsort as ns
ns.natsorted(num_list,reverse=True)

运行结果如下图:

python NaN 怎么用 python nat_数据清洗_04

2.1 排序版本号
import natsort as ns
a = ['1.2', '1.2rc1', '1.2beta2', '1.2beta1', '1.2alpha', '1.2.1', '1.1', '1.3']
ns.natsorted(a)

运行结果如下:

python NaN 怎么用 python nat_python_05


如果需要将1.2预发布的版本号置于1.2之后,1.2.1之前,可以使用以下代码:

ns.natsorted(a,key=lambda x:x.replace('.','~'))

运行后截图:

python NaN 怎么用 python nat_python NaN 怎么用_06


如果需要将1.2预发布的版本后置于1.2之前,可以使用以下代码:

ns.natsorted(a, key=lambda x: x.replace('.', '~')+'z')

运行结果见下图:

python NaN 怎么用 python nat_pandas_07

2.2 排序名称

对产品名称进行排序,一下是几个参考案例
例子1:

import pandas as pd
import natsort as ns
s = pd.Series(['2-7 class', '1-5 info', '10-2', '2-11', '7-6'])
s.sort_values(key=ns.natsort_keygen())

排序结果见下图:

python NaN 怎么用 python nat_python NaN 怎么用_08


例子2:

import natsort as ns
a = ['Apple', 'corn', 'Corn', 'Banana', 'apple', 'banana']
# 大写优先排序
ns.natsorted(a)
#小写优先排序
ns.natsorted(a, alg=ns.LOWERCASEFIRST)
#组合排序,即字母相同的排在一起,大写优先
ns.natsorted(a, alg=ns.GROUPLETTERS)
#组合排序且小写优先
ns.natsorted(a, alg=ns.G | ns.LF)

按照其顺序,分别显示其排序结果:

python NaN 怎么用 python nat_数据清洗_09

2.3 以utf8编码顺序排序

对utf8编码的字符排序时,直接改变对应的参数即可。

ns.natsorted([b'a10', b'a5'], key=ns.decoder('utf8'))

排序结果如下:

python NaN 怎么用 python nat_python_10

2.4 浮点类型排序

大多数情况下,我们直接调用默认的排序方法natsorted即可,但是个别数据格式不规范的情况下我们可以通过增加参数来进行正确排序。
排序代码如下:

# 1. 考虑科学计数法,忽略符号
ns.natsorted(a, alg=ns.FLOAT)
# 2. 考虑科学计数法和符号(常用)
ns.natsorted(a, alg=ns.FLOAT | ns.SIGNED)
# 3. 不考虑科学计数法,考虑符号
ns.natsorted(a, alg=ns.FLOAT | ns.SIGNED | ns.NOEXP)

其排序结果如下图:

python NaN 怎么用 python nat_字符串排序_11

2.5 路径排序

大部分情况下,在进行路径排序时,直接使用natsorted方法即可,但极少数情况下需要增加参数才可以使用,具体代码如下

# 使用默认的排序方法
a = ['/home/class/test(2).txt', '/home/class/test.txt',
     '/home/class(2)/test.txt', '/home/class(10)/test.txt']
ns.natsorted(a)

默认排序结果如下:

python NaN 怎么用 python nat_python NaN 怎么用_12


通过增加默认参数,代码如下:

ns.natsorted(a,alg=ns.PATH)

其排序结果如下:

python NaN 怎么用 python nat_字符串排序_13

3.natsort其他功能介绍

3.1 chain_functions函数

在一个含有多个函数的列表中,可以将前一个函数的函数值以参数形式传给当前函数。

funcs=[lambda x:x*3,len,lambda x:x+5]
func=ns.chain_functions(funcs)
func("a")

运行结果如下:

python NaN 怎么用 python nat_python_14

3.2 realsorted函数

该函数通常用来处理浮点数类型

ns. realsorted(a)

排序结果如下:

python NaN 怎么用 python nat_pandas_15

3.3 index_natsorted函数

对列表等可迭代对象的索引进行排序,其排序结果为索引,而不是值。

a=['a12','a5','a100','a3']
ns.index_natsorted(a)

其排序结果为列表的索引,如下图所示:

python NaN 怎么用 python nat_字符串排序_16

3.4 order_by_index函数

该函数可以按照某个列表等可迭代对象作为排序基准进行排序,常与index_natsorted函数连用。
代码如下:

a=['a12','a5','a100','a3']
b=[1,3,5,7]
index=ns.index_natsorted(a)
ns.order_by_index(b,index=index)

排序结果如下图:

python NaN 怎么用 python nat_python_17

3.5 与pandas的结合使用

pandas对于含有数字的字符串排序

import pandas as pd
df = pd.DataFrame({
    'name':['a','c','b','d','e'],
    'v':['20.5', '10.3', '12.3', '5', '6']})
df

原始数据截图:

python NaN 怎么用 python nat_python NaN 怎么用_18


使用默认的排序方法进行排序,排序代码和结果如下:

python NaN 怎么用 python nat_字符串排序_19


结合natsorted函数进行排序,代码如下:

df.sort_values('v',key= lambda x:ns.index_natsorted(x))
# 对排序结果,再进行索引排序
# df.sort_values('v',key= lambda x:ns.index_natsorted(x)).sort_index()

按照降序进行排序,其排序结果如下:

python NaN 怎么用 python nat_数据清洗_20