当前位置: 首页 > 后端技术 > Python

用pandas进行简单的数据预处理

时间:2023-03-26 19:43:48 Python

先来看这样的数据。这是kaggle上员工离职的数据。现在要根据满意度、工作项目、薪酬等指标来判断一个员工是否会辞职。在机器学习之前,我们首先需要对数据进行清理和预处理。资料下载https://github.com/ardenderta...1.查看统计数据。读取csv文件,拿到数据后,通常要先看数据长什么样子,有多大,有什么特点。使用pandas查看这些很方便。本例中的csv文件,我们使用read_csv函数读取,读取后是pandas中的DataFrame格式。importnumpyasnpimportpandasaspd#使用read_csv读取数据hr=pd.read_csv("HR.csv")但是有一点需要注意。阅读时,首先要看csv文件中的格式。主要看两点,一是第一列(或前几列)是不是索引,二是第一行是数据还是特征名称。默认情况下,read_csv方法会将第一行解析为特征。#如果第一列是索引pd.read_csv('data.csv',index_col=0)#如果是没有特征的纯数据,那么pd.read_csv('data.csv',header=None)实际上,如果你用的是ipython,可以直接输入pd.read_csv吗?查看该功能的文档,非常方便。查看数据#查看数据的行数和列数。一般来说,行代表样本个数,列代表特征个数hr.shape#查看前5行数据hr.head()#查看每列的计数和数据类型等信息hr.info()#查看统计信息hr.describe()一般来说,我们会看这些信息。从而对数据有一定的概念。2.简单的可视化Pandas提供了一个简单的功能,可以让我们非常简单的查看每一列的分布直方图。当然,它仅限于列值的个数。如果它是一个离散值,则无法将其可视化。值得注意的是,这个函数依赖matplotlib,必须先导入。有两个参数值得一提:grid:TrueorFalse;是否设置网格,这个看个人需要figsize:tuple;图的大小,画多个直方图的时候,设置大一点,这个多试几次就好了。至于其他的参数,一般来说用的不多,但是如果有需要可以看文档。强烈推荐使用ipython,直接用hr.hist可以吗?查看参数。功能文档。3.删除重复项。Pandas提供了一个duplicate函数来让我们检查是否有两个相同的行,也就是两个重复的行。它返回一个布尔值Series,其中重复为True,没有重复的地方为False#是的使用df.duplicated()查看是否有重复hr.duplicated(keep="last")keep:"first","last",错误。默认为“第一”。很重要的参数,first表示duplicates里面的第一个为False,其余为True。last的意思正好相反。最后一项为False,其他重复项为True。指定False将所有重复项设置为Truesubset:list,检查重复项,默认为all,即两行完全相同才判断为True。如果只想检查某些列是否相同,可以使用subset参数。除了查看重复项,我们还可以删除重复项。drop_duplicates提供了这个功能。hr=hr.drop_duplicates()保持:“第一”,“最后”,假。默认为“第一”。也就是说,默认情况下,保留最前面的重复项并删除其他重复项。“last”表示保留最后一个重复项并删除其他重复项。False表示删除所有重复项。subset:列表,默认为所有列。如果您只想删除几个相同的列,则可以使用此参数。就地:真或假。默认为False,即不修改原始DataFrame。设置为True将改变原始DataFrame。4.缺失值的处理缺失值的处理一直是数据处理中的重点工作。根据数据的不同,会做出不同的选择,用均值填充,用中位数填充,用0填充,甚至直接去掉。比较复杂的可以用autoencoder来训练和预测缺失值,缺失值的处理可以写一本厚书。这里简单介绍一下常用的处理方法。注意我的数据没有缺失值,你可以找其他数据试试。#用均值填充hr.fillna(hr.mean())#用中位数填充hr.fillna(hr.median())#用0填充hr.fillna(0)5.离散特征处理包含离散特征的数据不能直接用作机器学习的输入。比如性别,男,女,比如工资,低,中,高。需要做一个矢量化过程。有人说0、1、2不能直接用,比如0表示低,1表示中,2表示高。emmm,当然不是。如何对其进行矢量化?以这个数据中的职位和工资为例,001代表低,010代表中,100代表高。categorical_features=['sales','salary']hr_cat=pd.get_dummies(hr[categorical_features])hr=hr.drop(categorical_features,axis=1)hr=pd.concat([hr,hr_cat],axis=1)非常简单的代码,值得一提的是get_dummies函数。该函数的作用是将离散变量转化为向量化。我无法用一两句话解释清楚。这里我只告诉大家可以这样处理离散变量。如果想详细了解,可以通过阅读文档来了解。我没有发布文档。意思是。6.数据归一化向量归一化也很重要。最常见的归一化方法有两种,一种是min-max归一化,就是将每个值除以最大值减去最小值的差值,这样就可以将数据归一化到[0,1]之间。另一种是z-score标准化,即处理后的数据符合标准正态分布,即均值为0,标准差为1。这两种都很常见,具体用哪一种取决于数据。可以使用sklearn进行处理,就不用自己实现了。fromsklearn.preprocessingimportStandardScaler#使用z-score对数据进行标准化想要进行min-max归一化,sklearn也有现成的类实现。fromsklearn.preprocessingimportMinMaxScalers=MinMaxScaler()scale_features=['number_project','average_monthly_hours','time_spend_company']hr[scale_features]=ss.fit_transform(hr[scale_features])7.去除缺失率超过50%/的行Column这是我在处理其他数据时遇到的一个问题,就是有时候不只是根据某列的一部分去掉数据,而是根据缺失的比例来做一个trade-off。可能是缺失率超过30%,或者70%。我查了一下pandas,好像没有现成的功能可以直接实现。不过没关系,我写了两个函数来实现。去除缺失值比例超过一定水平的列defdrop_col(df,cutoff=0.4):n=len(df)forcolumnindf.columns:cnt=df[column].count()if(float(cnt)/n)