机器学习(三)机器学习的常用库之Pandas

python在机器学习领域得到广泛应用的重要原因之一是,python拥有庞大而活跃的第三方程序包,依托这些程序包,用户能够方便的完成绝大多数机器学习任务。

 1.Pandas库

1.1特点:

  • Pandas是基于Numpy构建的,在Numpy的基础上构建了一套特色鲜明的数据组织方式。增加了用户自定义索引;序列对应一维数组,数据框对应二维表格型数据结构,其中各元素的数据类型可以相同也可以不同。
  • Pandas数据框是存储机器学习数据集的常用形式。Pandas数据框具有复杂而精细的索引,通过索引能够更方便的实现数据子集的选取和访问。

1.2Pandas的序列和索引

import pandas as pd
import numpy as np
from pandas import Series,DataFrame
data = Series([1,2,3,4,5,6,7,8,9],index=['ID1','ID2','ID3','ID4','ID5','ID6','ID7','ID8','ID9'])
print('序列中的值:\n{0}'.format(data.values))
print('序列中的索引:\n{0}'.format(data.index))
print('访问序列的第一和第三上的值:\n{0}'.format(data[[0,2]]))
print('访问序列索引为ID1和ID3的值:\n{0}'.format(data[['ID1','ID3']]))
print('判断ID索引是否存在:%s;判断ID10索引是否存在:%s'%('ID1' in data,'ID10' in data))

 执行结果

序列中的值:
[1 2 3 4 5 6 7 8 9]
序列中的索引:
Index(['ID1', 'ID2', 'ID3', 'ID4', 'ID5', 'ID6', 'ID7', 'ID8', 'ID9'], dtype='object')
访问序列的第一和第三上的值:
ID1    1
ID3    3
dtype: int64
访问序列索引为ID1和ID3的值:
ID1    1
ID3    3
dtype: int64
判断ID索引是否存在:True;判断ID10索引是否存在:False

代码解释

.values返回各元素的元素值

.index返回各元素的索引

data[[0,2]]利用索引号访问指定元素,以列表形式指定多个索引号

data[['ID1','ID3']]利用索引名访问指定元素,以列表形式指定多个索引名

'ID1' in data判断是否存在某个索引名,存在返回True,不存在返回False

1.3Pandas的数据框和应用

用到的excel文件链接:

链接: https://pan.baidu.com/s/1ZIKRM6YBuDyLBtBsczBHYQ 提取码: z9dx 

data = pd.read_excel('C:\\Users\\adins\\Desktop\\北京市空气质量数据.xlsx')
print('data的类型:{0}'.format(type(data)))
print('数据框的行索引:{0}'.format(data.index))
print('数据框的列名:{0}'.format(data.columns))
print('访问AQI和PM2.5的所有值:\n{0}'.format(data[['AQI','PM2.5']]))
print('访问2至3行的AQI和PM2.5:\n{0}'.format(data.loc[1:2,['AQI','PM2.5']]))
print('访问索引1至索引2的第2列和第4列:{0}'.format(data.iloc[1:3,[1,3]]))
data.info()

执行结果

data的类型:
数据框的行索引:RangeIndex(start=0, stop=2155, step=1)
数据框的列名:Index(['日期', 'AQI', '质量等级', 'PM2.5', 'PM10', 'SO2', 'CO', 'NO2', 'O3',
       'Unnamed: 9', 'Unnamed: 10'],
      dtype='object')
访问AQI和PM2.5的所有值:
      AQI  PM2.5
0      81     45
1     145    111
2      74     47
3     149    114
4     119     91
...   ...    ...
2150  183    138
2151  175    132
2152   30      7
2153   40     13
2154   73     38

[2155 rows x 2 columns]
访问2至3行的AQI和PM2.5:
   AQI  PM2.5
1  145    111
2   74     47
访问索引1至索引2的第2列和第4列:   AQI  PM2.5
1  145    111
2   74     47

RangeIndex: 2155 entries, 0 to 2154
Data columns (total 11 columns):
 #   Column       Non-Null Count  Dtype         
---  ------       --------------  -----         
 0   日期           2155 non-null   datetime64[ns]
 1   AQI          2155 non-null   int64         
 2   质量等级         2155 non-null   object        
 3   PM2.5        2155 non-null   int64         
 4   PM10         2155 non-null   int64         
 5   SO2          2155 non-null   int64         
 6   CO           2155 non-null   float64       
 7   NO2          2155 non-null   int64         
 8   O3           2155 non-null   int64         
 9   Unnamed: 9   0 non-null      float64       
 10  Unnamed: 10  0 non-null      float64       
dtypes: datetime64[ns](1), float64(3), int64(6), object(1)
memory usage: 185.3+ KB

 代码解释

 .read_excel()函数将一个excel文件读入到数据框中

type(data)显示为类型为数据框

data.index返回数据框的行索引

data.columns返回数据框的列索引

data[['AQI','PM2.5']])利用列索引名访问指定变量,以列表形式指定多个索引列名

data.loc[1:2,['AQI','PM2.5']]利用数据框的loc属性访问指定行索引和变量名上的元素

data.iloc[1:3,[1,3]]利用数据框的iloc属性访问指定行索引和列索引号上的元素

data.info()返回数据框的行索引、列索引以及数据结构类型等信息

1.4Pandas的加工处理

import numpy as np
import pandas as pd
from pandas import Series,DataFrame
df1 = DataFrame({'key':['a','d','c','a','b','d','c'],'var1':range(7)})
df2 = DataFrame({'key':['a','b','c','c'],'var2':[0,1,2,2]})
df = pd.merge(df1,df2,on='key',how='outer')
df.iloc[0,2] = np.NaN
df.iloc[5,1] = np.NaN
print('合并后的数据:\n{0}'.format(df))
df = df.drop_duplicates()
print('删除重复行后的数据:\n{0}'.format(df))
print('判断是否为缺失值:\n{0}'.format(df.isnull()))
print('判断是否不为缺失值:\n{0}'.format(df.notnull()))
print('删除缺失值后的数据:\n{0}'.format(df.dropna()))
fill_value = df[['var1','var2']].apply(lambda x:x.mean())
print('以均值替换缺失值:\n{0}'.format(df.fillna(fill_value)))

 执行结果

合并后的数据:
  key  var1  var2
0   a   0.0   NaN
1   a   3.0   0.0
2   d   1.0   NaN
3   d   5.0   NaN
4   c   2.0   2.0
5   c   NaN   2.0
6   c   6.0   2.0
7   c   6.0   2.0
8   b   4.0   1.0
删除重复行后的数据:
  key  var1  var2
0   a   0.0   NaN
1   a   3.0   0.0
2   d   1.0   NaN
3   d   5.0   NaN
4   c   2.0   2.0
5   c   NaN   2.0
6   c   6.0   2.0
8   b   4.0   1.0
判断是否为缺失值:
     key   var1   var2
0  False  False   True
1  False  False  False
2  False  False   True
3  False  False   True
4  False  False  False
5  False   True  False
6  False  False  False
8  False  False  False
判断是否不为缺失值:
    key   var1   var2
0  True   True  False
1  True   True   True
2  True   True  False
3  True   True  False
4  True   True   True
5  True  False   True
6  True   True   True
8  True   True   True
删除缺失值后的数据:
  key  var1  var2
1   a   3.0   0.0
4   c   2.0   2.0
6   c   6.0   2.0
8   b   4.0   1.0
以均值替换缺失值:
  key  var1  var2
0   a   0.0   1.4
1   a   3.0   0.0
2   d   1.0   1.4
3   d   5.0   1.4
4   c   2.0   2.0
5   c   3.0   2.0
6   c   6.0   2.0
8   b   4.0   1.0

代码解释

df1 = DataFrame({'var1':range(7)})以字典形式建立数据框,字典的键对应列变量,值对应数据集列变量的值,多个值时以列表给出

pd.merge(df1,df2,on='key',how='outer')合并两个数据框 on: 要加入的列或索引级别名称。以该列为合并基础 how: One of ‘left’,‘right’,‘outer’,‘inner’.默认inner。inner是取交集,outer取并集。

df.iloc[]的用法和df.loc[]类似,最大的区别在于,loc是基于行列的标签进行检索,而iloc是基于位置进行检索。实际使用上iloc比loc会好用一些,因为使用loc时,还要判断标签的数据类类型。比如一个数据标签是2020,这可能是文本,也可能是整数,而根据位置来进行检索,则不需要考虑这么多

np.NaN在numpy中表示缺失值,统计上一般默认缺失值不参与分析

df.drop_duplicates() 剔除数据框中在全部变量上均重复取值的样本观测

df.isnull()、df.notnull()对数据框中的每个元素判断其是否为NaN,结果为Flase或True

df.dropna()删除含有NaN元素的样本观测行

.apply()函数 DataFrame.apply(func, axis=0, broadcast=False, raw=False, reduce=None, args=(), **kwds)该函数最有用的是第一个参数,这个参数是函数,相当于C/C++的函数指针。 这个函数需要自己实现,函数的传入参数根据axis来定,比如axis = 1,就会把一行数据作为Series的数据 结构传入给自己实现的函数中,我们在函数中实现对Series不同属性之间的计算,返回一个结果,则apply函数会自动遍历每一行DataFrame的数据,最后将所有结果组合成一个Series数据结构并返回。 df[['var1','var2']].apply(lambda x:x.mean())循环或依次对数据框df中变量var1和var2(均为序列)做匿名函数指定的计算x的平均值 df.fillna(fill_value)将所有的NaN替换为指定的值

1.5 pandas数据的加工处理和应用(一)

import numpy as np
import pandas as pd
from pandas import Series,DataFrame

data = pd.read_excel('C:\\Users\\adins\\Desktop\\北京市空气质量数据.xlsx')
data.replace(0,np.NaN)
data['年'] = data['日期'].apply(lambda x:x.year)
month= data['日期'].apply(lambda x:x.month)
quarter_month = {'1':'一季度','2':'一季度','3':'一季度',
                        '4':'二季度','5':'二季度','6':'二季度',
                        '7':'三季度','8':'三季度','9':'三季度',
                        '10':'四季度','11':'四季度','12':'四季度'}
data['季度'] = month.map(lambda x:quarter_month[str(x)])
bins =[0,50,100,150,200,300,1000]
data['等级']=pd.cut(data['AQI'],bins,labels=['一级优','二级良','三级轻度污染','四级中度污染','五级重度污染','六级严重污染'])
print('对AQI的分组结果:\n{0}'.format(data[['日期','AQI','等级','季度']]))

 执行结果

对AQI的分组结果:
             日期  AQI      等级   季度
0    2014-01-01   81     二级良  一季度
1    2014-01-02  145  三级轻度污染  一季度
2    2014-01-03   74     二级良  一季度
3    2014-01-04  149  三级轻度污染  一季度
4    2014-01-05  119  三级轻度污染  一季度
...         ...  ...     ...  ...
2150 2019-11-22  183  四级中度污染  四季度
2151 2019-11-23  175  四级中度污染  四季度
2152 2019-11-24   30     一级优  四季度
2153 2019-11-25   40     一级优  四季度
2154 2019-11-26   73     二级良  四季度

[2155 rows x 4 columns]

代码解释

 .replace(0,np.NaN)将数据框中的0替换为缺失值NaN

data['日期'].apply(lambda x:x.year)得到每个样本观测值的年份 数据中的日期为python的datetime类型,专用于存储日期和时间格式变量,python有整套处理datetime类型的方法和属性

month.map(lambda x:quarter_month[str(x)])map()对一个可迭代对象,依据指定的函数对其中的各个元素进行处理

pd.cut(data['AQI'],bins,labels=['一级优','二级良','三级轻度污染','四级中度污染','五级重度污染','六级严重污染']) cut()方法用于对连续数组进行分组,依据分组标准bins,对data['AQI']分组并给出分组标签

1.6Pandas的数据加工处理和应用(二)

print('各季度AQI和PM2.5的均值:\n{0}'.format(data.loc[:,['AQI','PM2.5']].groupby(data['季度']).mean()))
print('各季度AQI和PM2.5的描述统计量:\n',data.groupby(data['季度'])['AQI','PM2.5'].apply(lambda x:x.describe()))

def top(df,n=10,column='AQI'):
    return df.sort_values(by=column,ascending=False)[:n]

print('空气质量最差的5天:\n',top(data,n=5)[['日期','AQI','PM2.5','等级']])
print('各季度空气质量最差的3天:\n',data.groupby(data['季度']).apply(lambda x:top(x,n=3)[['日期','AQI','PM2.5','等级']]))
print('各季度空气质量情况:\n',pd.crosstab(data['等级'],data['季度'],margins=True,margins_name='总计',normalize=False))

执行结果

各季度AQI和PM2.5的均值:
            AQI      PM2.5
季度                        
一季度  109.125693  77.083179
三季度   98.731884  49.438406
二季度  108.766972  54.744954
四季度  109.400387  77.046422
各季度AQI和PM2.5的描述统计量:
                   AQI       PM2.5
季度                               
一季度 count  541.000000  541.000000
    mean   109.125693   77.083179
    std     80.468322   73.141507
    min      0.000000    0.000000
    25%     48.000000   24.000000
    50%     80.000000   53.000000
    75%    145.000000  109.000000
    max    470.000000  454.000000
空气质量最差的5天:
              日期  AQI  PM2.5      等级
1218 2017-05-04  500      0  六级严重污染
723  2015-12-25  485    477  六级严重污染
699  2015-12-01  476    464  六级严重污染
1095 2017-01-01  470    454  六级严重污染
698  2015-11-30  450    343  六级严重污染

各季度空气质量情况:
 季度      一季度  三季度  二季度  四季度    总计
等级                              
一级优     145   96   38  108   387
二级良     170  209  240  230   849
三级轻度污染   99  164  152   64   479
四级中度污染   57   72   96   33   258
五级重度污染   48   10   14   58   130
六级严重污染   21    0    2   23    46
总计      540  551  542  516  2149

代码解释

 .groupby()方法将数据按指定变量进行分组,对分组结果可以进一步对各组执行操作如计算均值等 x.describe()计算基本描述统计量(均值、标准差、最小值、四分位数、最大值) df.sort_values(by=column,ascending=False)通过指定column降序排序

pd.crosstab(data['等级'],data['季度'],margins=True,margins_name='总计',normalize=False)) crosstab可以方便的编制两个分类变量的列联表,注意最好是分类变量取值不太多的情况下,统计出现的次数效果比较好 

1.7pandas数据的加工处理和应用(三)

pd.get_dummies(data['等级'])
data.join(pd.get_dummies(data['等级']))
print(data)

执行结果

            日期  AQI  质量等级  PM2.5  PM10  SO2   CO  NO2  O3  Unnamed: 9  Unnamed: 10     年   季度      等级
0    2014-01-01   81     良     45   111   28  1.5   62  52         NaN          NaN  2014  一季度     二级良
1    2014-01-02  145  轻度污染    111   168   69  3.4   93  14         NaN          NaN  2014  一季度  三级轻度污染
2    2014-01-03   74     良     47    98   29  1.3   52  56         NaN          NaN  2014  一季度     二级良
3    2014-01-04  149  轻度污染    114   147   40  2.8   75  14         NaN          NaN  2014  一季度  三级轻度污染
4    2014-01-05  119  轻度污染     91   117   36  2.3   67  44         NaN          NaN  2014  一季度  三级轻度污染
...         ...  ...   ...    ...   ...  ...  ...  ...  ..         ...          ...   ...  ...     ...

 代码解释

  pd.get_dummies(data['等级'])可以得到分类变量'等级'的哑变量。 对分类的每个类型生成一个二值变量X,X取值为1表示是该类别,X取零表示不是该类别

data.join(pd.get_dummies(data['等级']))将原始数据和哑变量按行索引进行横向合并。使用join时应确保两份数据观测值在行索引上是一一对应的,像本例中两份数据来自同一个样本,行索引值一一对应

你可能感兴趣的:(机器学习,python,机器学习)