Pandas 排序,本章介绍几种Pandas
常用的排序方式,它们分别是:按标签排序(行排序和列排序),按值排序。用permutation()
函数创建一个顺序随机的整数数组,我们按照这个数组元素的顺序为DataFrame对象进行行排序,对DataFrame对象的所有行应用take()函数,把新的次序传给它。
本章介绍了Pandas
排序方法,极客教程NumPy 排序函数介绍了NumPy 提供的多种排序方式供读者参考。
下面来看看一个输出的例子:
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)
执行上面示例代码,得到以下结果:
col2 col1
1 1.233648 1.581921
4 -1.879616 1.385566
6 -0.504561 -2.248236
2 -0.199065 -0.731196
3 0.474318 -1.033490
5 0.573251 0.917004
9 0.449595 0.357354
8 0.175755 -2.331086
0 -1.941363 -0.169827
7 0.234169 -0.047134
在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
参数值为0
或1
,可以对列标签进行排序。 默认情况下,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()
提供了从mergeesort
,heapsort
和quicksort
中选择算法的一个配置。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)
输出结果如下:
用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))
输出结果如下:
如上所示,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相关知识,请参考:
Pandas GroupBy 用法
Pandas 读写json
Pandas 数据处理
Pandas 数据读写