4-Pandas数据预处理之排序(df.sort_index()、df.sort_values()、随机重排、随机采样)
排序是一种索引机制的一种常见的操作方法,也是Pandas重要的内置运算,主要包括以下3种方法:
排序方法 | 说明 |
---|---|
sort_values() | 根据某一列的值进行排序 |
sort_index() | 根据索引进行排序 |
随机重排 | 详见后面 |
本节以新冠肺炎的部分数据为例(读取“today_world_2020_04_18.csv”的国家名、时间、累计确诊、累计治愈、累计死亡这5列)
一、sort_values()
注意:默认情况下sort_values()是升序排列,ascending = Fals表示降序;
sort_values()也可以对缺失值进行排序,默认情况下,缺失值是排在最后的,但是可以通过设置参数na_position='first'将缺失值排在最前;
例:>>>df.sort_values('avg_cur_bal',ascending=True,na_position='first')[:5]
import pandas as pd import numpy as np df = pd.read_csv('.input/today_world_2020_04_18.csv', usecols=['name','lastUpdateTime','total_confirm','total_dead','total_heal'],encoding='gbk') #使用sort_values()根据累计确诊人数的进行降序重排,并列出排名前10的国家信息; df.sort_values('total_confirm',ascending=False)[:10] name lastUpdateTime total_confirm total_dead total_heal 9 美国 2020-04-17 15:01:45 677146 34641 56159 168 西班牙 2020-04-18 00:00:31 188068 19478 74797 160 意大利 2020-04-18 03:16:25 172434 22745 40164 155 法国 2020-04-18 07:35:22 147969 18681 34420 8 德国 2020-04-18 07:23:10 140886 4326 83114 159 英国 2020-04-18 00:00:31 108692 14576 622 2 中国 2020-04-18 08:03:46 84176 4642 77723 14 伊朗 2020-04-18 00:00:31 79494 4958 54064 143 土耳其 2020-04-18 03:38:28 78546 1769 8631 178 比利时 2020-04-18 00:00:31 36138 5163 7961
二、sort_index()
>>> df.sort_index(ascending=False)[:5] name lastUpdateTime total_confirm total_dead total_heal 203 马达加斯加 2020-04-18 07:57:30 117 0 33 202 列支敦士登 2020-04-12 00:00:31 79 1 55 201 阿曼 2020-04-18 03:28:30 1069 6 176 200 罗马尼亚 2020-04-18 03:52:56 8067 411 1508 199 格恩西岛 2020-03-27 11:33:37 1 0 0
三、随机重排
sort_values()和sort_index()只能对DataFrame进行升序或降序排列,若希望随机打乱排列顺序(即随机重排),方法如下:
步骤1:使用numpy.random.permutation()产生一个重排后的整数数组【注:numpy.random.permutation可随机排列一个序列,返回一个随机排列后的序号】
步骤2:使用.iloc[]或take()得到重排后的Pandas对象。
#步骤一:取出随机序列 >>> import numpy as np >>> sampler = np.random.permutation(5) >>> sampler array([1, 2, 3, 4, 0]) #步骤二:以步骤一得到的随机序列为索引,取出这些数据 #take()函数 >>> df.take(sampler) name lastUpdateTime total_confirm total_dead total_heal 1 塞尔维亚 2020-04-18 00:00:31 5690 110 534 2 中国 2020-04-18 08:03:46 84176 4642 77723 3 日本 2020-04-18 00:00:31 10535 210 1657 4 泰国 2020-04-18 00:00:31 2700 47 1689 0 突尼斯 2020-04-18 08:09:13 864 37 43 #iloc方法 >>> df.iloc[sampler] name lastUpdateTime total_confirm total_dead total_heal 1 塞尔维亚 2020-04-18 00:00:31 5690 110 534 2 中国 2020-04-18 08:03:46 84176 4642 77723 3 日本 2020-04-18 00:00:31 10535 210 1657 4 泰国 2020-04-18 00:00:31 2700 47 1689 0 突尼斯 2020-04-18 08:09:13 864 37 43
四、随机采样
使用sample()进行随机采样,随机采样的量可通过参数n和frac来设置,n表示按照n指定的数量来进行抽样,frac表示按照指定的比例进行抽样。
注意:
(1)sample默认的是不放回采样(即每个样本只能出现一次),可以通过设置replace = True将其设置为有放回采样;
例如:>>>df.sample(n=5,replace = True)
(2)若希望重复某次采样的结果,可以设置random_state参数为同一个数来实现(random_state的大小没有任何意思,只是这是为同一个数来通知两次随机采样的结果相同):
例如:>>>df.sample(n=5,random_state=1)
(3)sample也可以实现列的随机采样,只需要设置axis=1即可:
例如:>>>df.sample(n=2,axis=1)[:5]
>>> df.sample(3) name lastUpdateTime total_confirm total_dead total_heal 163 芬兰 2020-04-18 02:51:06 3489 82 1700 144 巴布亚新几内亚 2020-04-08 00:00:31 2 0 0 94 索马里 2020-04-16 07:33:23 80 5 2
使用sample()也可以实现重排
>>> df.sample(len(df))[:5] name lastUpdateTime total_confirm total_dead total_heal 99 马里 2020-04-18 03:33:59 190 13 34 12 圣巴泰勒米 2020-03-27 11:18:38 3 0 0 117 吉尔吉斯斯坦 2020-04-18 00:00:31 489 5 114 88 斯威士兰 2020-04-18 07:55:57 19 1 8 178 比利时 2020-04-18 00:00:31 36138 5163 7961