Pandas 排序

Pandas 排序,本章介绍几种Pandas常用的排序方式,它们分别是:按标签排序(行排序和列排序),按值排序。用permutation()函数创建一个顺序随机的整数数组,我们按照这个数组元素的顺序为DataFrame对象进行行排序,对DataFrame对象的所有行应用take()函数,把新的次序传给它。

下面来看看一个输出的例子:

import pandas as pd
import numpy as np

unsorted_df=pd.DataFrame(np.random.randn(10,2),index=[1,4,6,2,3,5,9,8,0,7],
columns=['col2','col1'])
print(unsorted_df)

执行上面示例代码,得到以下结果:
Pandas 排序

unsorted_df数据值中,标签和值未排序,下面来看看如何按标签来排序。

按标签排序

使用sort_index()方法,通过传递axis参数和排序顺序,可以对DataFrame进行排序。 默认情况下,按照升序对行标签进行排序。

import pandas as pd
import numpy as np

unsorted_df = pd.DataFrame(np.random.randn(10,2),index=[1,4,6,2,3,5,9,8,0,7],columns = ['col2','col1'])

sorted_df=unsorted_df.sort_index()
print(sorted_df)

执行上面示例代码,得到以下结果:

       col2      col1
0  0.494852  0.469899
1 -1.329946  0.704672
2 -0.022500  0.195202
3  0.491316  0.204614
4  0.360525  0.888700
5  0.867900  0.919920
6  0.120100  0.733944
7 -0.709786  0.178722
8  0.933755 -0.491567
9  0.843475  0.108405

按行排序

通过将布尔值传递给升序参数,可以控制排序顺序。 来看看下面的例子来理解一下。

import pandas as pd
import numpy as np

unsorted_df = pd.DataFrame(np.random.randn(10,2),index=[1,4,6,2,3,5,9,8,0,7],columns = ['col2','col1'])

sorted_df = unsorted_df.sort_index(ascending=False)
print (sorted_df)

执行上面示例代码,得到以下结果:

       col2      col1
9 -0.944709 -1.951749
8  0.783624 -1.064380
7 -1.158316  0.824515
6  1.047127  3.239199
5 -1.261870  2.049151
4  1.090100 -1.565506
3  2.479735 -1.243233
2 -0.079927 -0.144423
1  1.098841 -0.179055
0 -1.221807  0.833332

按列排序

通过传递axis参数值为01,可以对列标签进行排序。 默认情况下,axis = 0,逐行排列。来看看下面的例子来理解这个概念。

import pandas as pd
import numpy as np

unsorted_df = pd.DataFrame(np.random.randn(10,2),index=[1,4,6,2,3,5,9,8,0,7],columns = ['col2','col1'])

sorted_df=unsorted_df.sort_index(axis=1)

print (sorted_df)

执行上面示例代码,得到以下结果:

       col1      col2
1 -0.874212 -1.500224
4  0.388786 -1.661723
6  0.141344  0.955404
2  1.593505  1.822118
3 -1.407891 -0.441019
5  1.711577  0.091644
9  1.084015  0.459618
8 -1.020528 -1.076027
0 -0.026024 -1.352497
7 -0.686478  1.645714

按值排序

像索引排序一样,sort_values()是按值排序的方法。它接受一个by参数,它将使用要与其排序值的DataFrame的列名称。

import pandas as pd
import numpy as np

unsorted_df = pd.DataFrame({'col1':[2,1,1,1],'col2':[1,3,2,4]})
sorted_df = unsorted_df.sort_values(by='col1')

print (sorted_df)

执行上面示例代码,得到以下结果:

   col1  col2
1     1     3
2     1     2
3     1     4
0     2     1

注意: 观察上面的输出结果,col1值被排序,相应的col2值和行索引将随col1一起改变。因此,它们看起来没有排序。

通过by参数指定需要列值,参考以下示例代码:

import pandas as pd
import numpy as np

unsorted_df = pd.DataFrame({'col1':[2,1,1,1],'col2':[1,3,2,4]})
sorted_df = unsorted_df.sort_values(by=['col1','col2'])

print (sorted_df)

执行上面示例代码,得到以下结果:

   col1  col2
2     1     2
1     1     3
3     1     4
0     2     1

排序算法

sort_values()提供了从mergeesortheapsortquicksort中选择算法的一个配置。Mergesort是唯一稳定的算法。参考以下示例代码:

import pandas as pd
import numpy as np

unsorted_df = pd.DataFrame({'col1':[2,1,1,1],'col2':[1,3,2,4]})
sorted_df = unsorted_df.sort_values(by='col1' ,kind='mergesort')

print (sorted_df)

执行上面示例代码,得到以下结果:

   col1  col2
1     1     3
2     1     2
3     1     4
0     2     1

take() 函数

numpy.ramdom.permutation()函数,调用Series对象或DataFrame对象各行的顺序(随机排序)很简单,如下所示,创建一个元素为整数且按照升序排列的DataFrame对象。

import pandas as pd
import numpy as np

nframe = pd.DataFrame(np.arange(25).reshape(5,5))
print(nframe)

输出结果如下:

Pandas 排序

permutation()函数创建一个包含0-4(顺序随机)这五各整数的数组,我们按照这个数组元素的顺序为DataFrame对象进行行排序,对DataFrame对象的所有行应用take()函数,把新的次序传给它。如下所示:

import pandas as pd
import numpy as np

nframe = pd.DataFrame(np.arange(25).reshape(5,5))
new_order = np.random.permutation(5)
print(new_order)
print('------------')
print(nframe.take(new_order))

输出结果如下:
Pandas 排序

如上所示,DataFrame对象各行的位置发生改变,新索引的顺序跟new_order数组的元素顺序保持一致。你甚至可以只对DataFrame对象的一部分进行排序操作。它将生成一个数组,只包含特定索引范围的数据,如下所示:

import pandas as pd
import numpy as np

nframe = pd.DataFrame(np.arange(25).reshape(5,5))
new_order = [3,4,2]
print(nframe.take(new_order))

输出结果如下:
Pandas 排序

赞(0)

评论 抢沙发

评论前必须登录!