python在机器学习领域得到广泛应用的重要原因之一是,python拥有庞大而活跃的第三方程序包,依托这些程序包,用户能够方便的完成绝大多数机器学习任务。
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
用到的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()返回数据框的行索引、列索引以及数据结构类型等信息
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替换为指定的值
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']分组并给出分组标签
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可以方便的编制两个分类变量的列联表,注意最好是分类变量取值不太多的情况下,统计出现的次数效果比较好
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时应确保两份数据观测值在行索引上是一一对应的,像本例中两份数据来自同一个样本,行索引值一一对应