之前在《[Python]关于‘DataFrame’对象没有‘sort’属性》一文中,发现了《Python数据分析与挖掘实战》一书中关于第8章实验代码的一些在新版本的 pandas
库中出现错误,同时给出了相应的解决方案。在第9章的学习中也发现,其中 shuffle
(打乱)数据也出现了一些问题。
所以,本文主要是讲解一下关于 pandas
如何打乱数据的一些方法。
关于 pandas
使用 random.shuffle(data)
的错误结果
该书中“第9章 基于水色图像的水质评价”中关于数据打乱引入的包是 random
,利用
random.shuffle(data)
后会出现如下结果:
1 | [[ 1.00000000e+00 1.00000000e+00 5.82822907e-01 ... -1.26431370e-02 |
可以看出,第1行数据和第5行数据是相同的,而原本数据中并没有完全相同的数据,所以说使用 random.shuffle(data)
使数据重复而且缺失了,下面是将全部数据的类别输出以做更进一步的解释:
1 | [1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. |
可以看出,数据总量是不变的,但是类别缺少了 类别5 ,所以使用该 shuffle
是会导致后面的结果出现问题的。
利用 type()
方法查看数据类型可以得知,该 data 的数据类型是 NumPy数组 ,对NumPy数组进行测试可以得知:
random.shuffle(data)
并不完全支持NumPy数组
经过我的初步实验,结果得出 random.shuffle(data)
对普通的数组等都是支持的,但是对 NumPy数组 会出现类如重复、缺失等现象,所以说对于NumPy数组并不适合用 random
库来实现数据打乱。
同样的, pandas
中的**DataFrame
也是不适用这种方式打乱数据的**。
打乱数据方法
1、NumPy特有方法
numpy
库中有 np.random.shuffle(x)
和 np.random.permutation(x)
两种打乱顺序的方法。前一个是改变数据自身顺序;后一个是返回一个随机排列,自身数据不变。
1 | import numpy as np |
2、DataFrame特有方法
pandas
库自带有 DataFrame
数据打乱的方法,基本的写法如下:
1 | # 假设df = DataFrame |
其中,参数 frac
是返回数据的比例,1即100%,如果只需要数据的80%,参数即为 frac=0.8
。如果需要打乱后数据集的 index
(索引)还是按照正常的排序,则如下:
1 | df.sample(frac=1).reset_index(drop=True) |
3、 sklearn
(机器学习的库)的 shuffle
方法
sklearn
库中 shuffle
方法是适用于 DataFrame
以及NumPy数组的,它的基本用法如下:
1 | from sklearn.utils import shuffle |
个人觉得,在不太清楚数据类型的时候,使用 sklearn
库的 shuffle
方法是最好的。