python机器学入门到精通(二)
讲到机器学习,是离不开各种工具库的,特别是pandas。今天我们就来了解一下pandas的一些基础知识。
【本篇所有代码均在jupyter上面运行】
初识pandas
pandas是python analysis data library 或pandas是基于NumPy的一种工具,该工具是为了解决数据分析任务而创建的。 pandas纳入了大量库和一些标准的数据类型,提供了高效的操作大型数据集所需的工具。 pandas提供了大量能是我们快速边界地处理数据的函数和方法,它使python成为强大而高效的数据分析环境的重要因素之一。
数据分析有三剑客,即三个模块:
# 数据分析有三剑客,三个模块import numpy as npimport pandas as pd
from pandas import Series,DataFrame# 前两个属于数据分析,展示数据,画图,一图顶千言
import matplotlib.pyplot as plt
# 如果大家用的自己的ubuntu或者用的windows系统尽心数据分心,使用plt.imshow(显示图片,图片没有出来)
1. Series
Series是一种类似与一维数组的对象,由下面两个部分组成:
- values:一组数据(ndarray类型)
- index:相关的数据索引标签
1)Series的创建
两种创建方式:
(1) 由列表或numpy数组创建
默认索引为0到N-1的整数型索引
nd = np.random.randint(0,150,size=10)
nd
Series(nd)
Out[]:
0 107
1 28
2 81
3 11
4 148
5 68
6 44
7 69
8 131
9 88
dtype: int64
或者
# string 类型在Series中也会显示成object
l = list('qwertyuiop')
s = Series(l)
s
Out[]:
0 q
1 w
2 e
3 r
4 t
5 y
6 u
7 i
8 o
9 p
dtype: object
通过设置index参数指定索引
# mysql中有两种索引,语言中一般也有两种索引,比如dict 枚举型(数字),关联索引('字符串')
l = [1,2,3,4,5]
s = Series(l,index=list('abcde'))
s
Out[]:
a 1
b 2
c 3
d 4
e 5
dtype: int64
name参数
# name比较类似于表名
# Series用于创建一维数据
l = [1,2,3]
s1 = Series(np.random.randint(0,150,size=8), index=list('abcdefgh'), name='python')
s2 = Series(np.random.randint(0,150,size=8), index=list('abcdefgh'), name='数学')
s3 = Series(np.random.randint(0,150,size=8), index=list('abcdefgh'), name='语文')
display(s1,s2,s3)
Out[]:
a 11
b 28
c 15
d 64
e 126
f 75
g 103
h 86
Name: python, dtype: int64
a 112
b 120
c 14
d 95
e 66
f 48
g 49
h 87
Name: 数学, dtype: int64
a 48
b 1
c 22
d 114
e 121
f 147
g 64
h 120
Name: 语文, dtype: int64
# copy属性
# Series是引用ndarray或列表
nd = np.ones((10))
s = Series(nd,copy=True)
s
Out[]:
0 1.0
1 1.0
2 1.0
3 1.0
4 1.0
5 1.0
6 1.0
7 1.0
8 1.0
9 1.0
dtype: float64
特别地,由ndarray创建的是引用,而不是副本。对Series元素的改变也会改变原来的ndarray对象中的元素。(列表没有这种情况)
(2) 由字典创建
# 字典的方式在实际的应用中比较适合Series
# 我们在教学中,我为了方便会使用ndarray
s=Series({'a':1, 'b':2, 'c':3})
s
Out[]:
a 1
b 2
c 3
dtype: int64
2)Series的索引和切片
可以使用中括号取单个索引(此时返回的是元素类型),或者中括号里一个列表取多个索引(此时返回的仍然是一个Series类型)。分为显示索引和隐式索引:
(1) 显式索引:
- 使用index中的元素作为索引值
- 使用.loc[](推荐)
可以理解为pandas是ndarray的升级版,但是Series也可是dict的升级版
注意,此时是闭区间
s2
Out[]:
a 121
b 31
c 51
d 3
e 120
f 42
g 146
h 50
Name: 数学, dtype: int64
# 如果Series想同时获得两个及以上的值,那么索引必须是一个list
s2[['a','b']]
Out[]:
a 121
b 31
Name: 数学, dtype: int64
(2) 隐式索引:
- 使用整数作为索引值
- 使用.iloc[](推荐)
注意,此时是半开区间
s2
Out[]:
a 121
b 31
c 51
d 3
e 120
f 42
g 146
h 50
Name: 数学, dtype: int64
s2[0]
Out[]:
121
s2.iloc[[0,1]]
Out[]:
a 121
b 31
Name: 数学, dtype: int64
s2[:5]
Out[]:
a 121
b 31
c 51
d 3
e 120
Name: 数学, dtype: int64
切片
# 显式索引是闭区间
# 显式索引,即使超出了范围也不会报错,会显示到最大的索引
s2['a':'z']
Out[]:
a 121
b 31
c 51
d 3
e 120
f 42
g 146
h 50
Name: 数学, dtype: int64
l = [1,2,3,4,5]
s = Series(l, index=list('你我他她它'))
s
Out[]:
你 1
我 2
他 3
她 4
它 5
dtype: int64
显式切片
s2.shape
Out[]:
(8,)
3)Series的基本概念
可以把Series看成一个定长的有序字典
可以通过shape,size,index,values等得到series的属性
s2.index
Out[]:
Index(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'], dtype='object')
s2.values
Out[]:
array([121, 31, 51, 3, 120, 42, 146, 50])
#但是Series值是一个ndarray类型的
type(s1.values)
使用pandas读取CSV文件
# 读取文件,使用的是pandas,不是使用数据类型
h = pd.read_csv('./data/500_Cities__Local_Data_for_Better_Health.csv')
h.shape
Out[]:
# 有八十多万条数据
(810103, 24)
#只看csv文件里面前五个数据
h.head()
Out[]:Year StateAbbr StateDesc CityName GeographicLevel DataSource Category UniqueID Measure Data_Value_Unit ... High_Confidence_Limit Data_Value_Footnote_Symbol Data_Value_Footnote PopulationCount GeoLocation CategoryID MeasureId CityFIPS TractFIPS Short_Question_Text
0 2014 US United States NaN US BRFSS Prevention 59 Current lack of health insurance among adults ... % ... 15.2 NaN NaN 308745538.0 NaN PREVENT ACCESS2 NaN NaN Health Insurance
1 2014 US United States NaN US BRFSS Prevention 59 Current lack of health insurance among adults ... % ... 14.3 NaN NaN 308745538.0 NaN PREVENT ACCESS2 NaN NaN Health Insurance
2 2014 US United States NaN US BRFSS Health Outcomes 59 Arthritis among adults aged >=18 Years % ... 23.7 NaN NaN 308745538.0 NaN HLTHOUT ARTHRITIS NaN NaN Arthritis
3 2014 US United States NaN US BRFSS Health Outcomes 59 Arthritis among adults aged >=18 Years % ... 25.9 NaN NaN 308745538.0 NaN HLTHOUT ARTHRITIS NaN NaN Arthritis
4 2014 US United States NaN US BRFSS Unhealthy Behaviors 59 Binge drinking among adults aged >=18 Years % ... 17.1 NaN NaN 308745538.0 NaN UNHBEH BINGE NaN NaN Binge Drinking
5 rows × 24 columns
当索引没有对应的值时,可能出现缺失数据显示NaN(not a number)的情况
s6 = Series({'a':1,'b':2, 'c':np.e, 'd':None, 'e':np.nan})
s6
# mysql->
# mysql中Null的运行效率最低,我们在开发中,对于一些不重要的字段给以一个default 0, 用户可以不用输入一些值
# Null在统计,分组,(where|having)查询的时候效率非常低
# select name, age from user where id=1
# select name, age from user having id=1
# null NaN# NaN在数据计算的时候效率也非常的低下,但是NaN不可避免,?,因为数据在导入的时候可能会加载不完全
# 但是NaN不影响计算
Out[]:
a 1.000000
b 2.000000
c 2.718282
d NaN
e NaN
dtype: float64
可以使用pd.isnull(),pd.notnull(),或自带isnull(),notnull()函数检测缺失数据
pd.isnull(s6)
Out[]:
a False
b False
c False
d True
e True
dtype: bool
4)Series的运算
1)适用于numpy的数组运算也适用于Series
s2
Outp[]:
a 112
b 120
c 14
d 95
e 66
f 48
g 49
h 87
Name: 数学, dtype: int64
s2[c]
Out[]:
c 14
d 95
e 66
f 48
g 49
h 87
Name: 数学, dtype: int64
nd = np.random.randint(0,150,size=10)
nd
Out[]:
array([120, 122, 72, 95, 19, 122, 0, 22, 111, 93])
# 返回结果为true or false
nd < 99
Out[]:array([False, False, True, True, True, False, True, True, False,True])
cond = nd <99
nd[cond]
Out[]:array([72, 95, 19, 0, 22, 93])
(2) Series之间的运算
- 在运算中自动对齐不同索引的数据
- 如果索引不对应,则补NaN
- 注意:要想保留所有的index,则需要使用.add()函数
我们来定义两个list:
s1 = Series(np.random.randint(0,100,size=8), index=list('qwertyui'))
s2 = Series(np.random.randint(0,100,size=8), index=list('ertyuiop'))
# 我们可以看到,两个列表都有的值就会相加,没有的就会返回nan
s1 + s2
Out[]:
e 159.0
i 122.0
o 71.0
p 163.0
q NaN
r 146.0
t 104.0
u 99.0
w NaN
y 154.0
dtype: float64
我们不需要NaN, 所以我们都会使用fill_value=0填充值
s1.add(s2,fill_value=0)
Out[]:
e 159.0
i 122.0
o 71.0
p 163.0
q 30.0
r 146.0
t 104.0
u 99.0
w 46.0
y 154.0
dtype: float64
pd.add()
DataFrame
是一个【表格型】的数据结构,可以看做是【由Series组成的字典】(共用同一个索引)。DataFrame由按一定顺序排列的多列数据组成。设计初衷是将Series的使用场景从一维拓展到多维。DataFrame既有行索引,也有列索引。
行索引:index
列索引:columns
值:values(numpy的二维数组)
我们的训练集(一些二维的数据)都是二维的,那么Series满足不了这个条件,xy轴, 轴上的一点(0,0)
等于mysql中的table
Series是一列
DataFrame是多列
DataFrame公用同一索引
1)DataFrame的创建
最常用的方法是传递一个字典来创建。DataFrame以字典的键作为每一【列】的名称,以字典的值(一个数组)作为每一列。
此外,DataFrame会自动加上每一行的索引(和Series一样)。
同Series一样,若传入的列与字典的键不匹配,则相应的值为NaN。
df = DataFrame({'数学':['100','90','80','70','60'],'语文':['101','91','81','71','61'],'python':['102','92','82','72','62']}, index=list('abcde'), columns=['数学','语文','python'])
df
Out[]:数学 语文 python
a 100 101 102
b 90 91 92
c 80 81 82
d 70 71 72
e 60 61 62
# 这是比较现实的数据格式
df1 = DataFrame(np.random.randint(0,150,size=(5,3)),index=list('abcde'),columns=['数学','语文','python'])
df1
Out[]:数学 语文 python
a 127 20 104
b 134 49 21
c 56 37 19
d 142 61 111
e 125 123 4
错误的创建示范,给index(行)多增加一个
df4 = DataFrame({'数学':['100','90','80','70','60'],'语文':['101','91','81','71','61'],'python':['102','92','82','72','62']}, index=['思聪','雷军','黄飞鸿','桃白白','马云'], columns=['数学','语文','python','英语'])
df4
Out[]:数学 语文 python 英语
思聪 100 101 102 NaN
雷军 90 91 92 NaN
黄飞鸿 80 81 82 NaN
桃白白 70 71 72 NaN
马云 60 61 62 NaN
DataFrame属性:values、columns、index、shape、ndim、dtypes
df4.values
Out[]:
array([['100', '101', '102', nan],['90', '91', '92', nan],['80', '81', '82', nan],['70', '71', '72', nan],['60', '61', '62', nan]], dtype=object)
df4.columns
Out[]:
Index(['数学', '语文', 'python', '英语'], dtype='object')
df4.ndim
Out[]:
2
# dataframe 是不可以使用的dtype这个属性的,只能使用dtypes
df4.dtypes
Out[]:
数学 object
语文 object
python object
英语 object
dtype: object
2)DataFrame的索引
(1) 对列进行索引
- 通过类似字典的方式
- 通过属性的方式
可以将DataFrame的列获取为一个Series。返回的Series拥有原DataFrame相同的索引,且name属性也已经设置好了,就是相应的列名。
思聪 102
雷军 92
黄飞鸿 82
桃白白 72
马云 62
Name: python, dtype: object
# 如何同时取出两列
df4[['python','英语']]
Out[]:python 英语
思聪 102 NaN
雷军 92 NaN
黄飞鸿 82 NaN
桃白白 72 NaN
马云 62 NaN
df4['python']['马云']
Out[]: '62'
df4.python
Out[]:
思聪 102
雷军 92
黄飞鸿 82
桃白白 72
马云 62
Name: python, dtype: object
(2) 对行进行索引
- 使用.loc[]加index来进行行索引
- 使用.iloc[]加整数来进行行索引
同样返回一个Series,index为原来的columns。
df4.loc['雷军'] #Series
Out[]:
数学 90
语文 91
python 92
英语 NaN
Name: 雷军, dtype: object
# 多个值是DataFrame
df4.loc[['雷军','桃白白'],['python','数学']]
Out[]:python 数学
雷军 92 90
桃白白 72 70
df4.loc['雷军','python'] # numpy.int64
Out[]: '92'
(3) 对元素索引的方法
- 使用列索引
- 使用行索引(iloc[3,1]相当于两个参数;iloc[[3,3]] 里面的[3,3]看做一个参数)
- 使用values属性(二维numpy数组)
df4.iloc[0,0]
Out[]:'100'
df4.iloc[0:3,0:2]
Out[]: 数学 语文
思聪 100 101
雷军 90 91
黄飞鸿 80 81
# 这种方式会用的比较多,因为结构比较清晰(看个人喜好)
df4.iloc[0][1]
Out[]: '101'
【注意】
直接用中括号时:
索引表示的是列索引
切片表示的是行切片
3)DataFrame的运算
(1) DataFrame之间的运算
同Series一样:
在运算中自动对齐不同索引的数据
如果索引不对应,则补NaN
df4 + df4
Out[]:数学 语文 python 英语
思聪 100100 101101 102102 NaN
雷军 9090 9191 9292 NaN
黄飞鸿 8080 8181 8282 NaN
桃白白 7070 7171 7272 NaN
马云 6060 6161 6262 NaN
s = Series(['1','2','3','4','5'])
s
Out[]:
0 1
1 2
2 3
3 4
4 5
dtype: object
df5 = DataFrame(np.random.randint(0,150,size=(5,4)),index=list('abcde'), columns=['数学','语文','python','英语'])df6 = DataFrame(np.random.randint(0,150,size=(5,4)),index=list('cdefg'), columns=['数学','语文','python','英语'])
df5 + df6
Out[]: 数学 语文 python 英语
a NaN NaN NaN NaN
b NaN NaN NaN NaN
c 235.0 94.0 282.0 38.0
d 43.0 184.0 223.0 174.0
e 71.0 260.0 251.0 133.0
f NaN NaN NaN NaN
g NaN NaN NaN NaN
df5.add(df6, fill_value=0)
Out[]:数学 语文 python 英语
a 27.0 99.0 137.0 71.0
b 118.0 1.0 72.0 12.0
c 235.0 94.0 282.0 38.0
d 43.0 184.0 223.0 174.0
e 71.0 260.0 251.0 133.0
f 31.0 144.0 55.0 130.0
g 52.0 49.0 3.0 85.0
下面是Python 操作符与pandas操作函数的对应表:
Python Operator | Pandas Method(s) |
---|---|
+
|
add()
|
-
|
sub() , subtract()
|
*
|
mul() , multiply()
|
/
|
truediv() , div() , divide()
|
//
|
floordiv()
|
%
|
mod()
|
**
|
pow()
|
(2) Series与DataFrame之间的运算
【重要】
使用Python操作符:以行为单位操作(参数必须是行),对所有行都有效。(类似于numpy中二维数组与一维数组的运算,但可能出现NaN)
使用pandas操作函数:
axis=0:以列为单位操作(参数必须是列),对所有列都有效。
axis=1:以行为单位操作(参数必须是行),对所有行都有效。
列方向
df4Out[]:数学 语文 python 英语
思聪 100 101 102 NaN
雷军 90 91 92 NaN
黄飞鸿 80 81 82 NaN
桃白白 70 71 72 NaN
马云 60 61 62 NaN
s = Series([1,2,3,4,5])
s
Out[]:0 11 22 33 44 5dtype: int64
df5.add(s, axis=1)
Out[]:数学 语文 python 英语 0 1 2 3 4
a NaN NaN NaN NaN NaN NaN NaN NaN NaN
b NaN NaN NaN NaN NaN NaN NaN NaN NaN
c NaN NaN NaN NaN NaN NaN NaN NaN NaN
d NaN NaN NaN NaN NaN NaN NaN NaN NaN
e NaN NaN NaN NaN NaN NaN NaN NaN NaN
# 行方向
df5.add(s, axis=0)
Out[]:数学 语文 python 英语
a NaN NaN NaN NaN
b NaN NaN NaN NaN
c NaN NaN NaN NaN
d NaN NaN NaN NaN
e NaN NaN NaN NaN
0 NaN NaN NaN NaN
1 NaN NaN NaN NaN
2 NaN NaN NaN NaN
3 NaN NaN NaN NaN
4 NaN NaN NaN NaN
python机器学入门到精通(二)相关推荐
- 编程没基础学python多长时间--零基础学Python,从入门到精通需要多长时间
求一份小甲鱼的<零基础入门学习Python>视频教程 评论 本系列教程面向础的同学,是一个深入浅通俗易懂的Python3视频教程. 适群 完全零基础入门,不需要任何前置知识. 教程概述 前 ...
- python从入门到精通需要多久--零基础学Python,从入门到精通需要多长时间
求一份小甲鱼的<零基础入门学习Python>视频教程 评论 本系列教程面向础的同学,是一个深入浅通俗易懂的Python3视频教程. 适群 完全零基础入门,不需要任何前置知识. 教程概述 前 ...
- 零基础python从入门到精通 pdf-跟老齐学Python:从入门到精通PDF电子版
跟老齐学Python:从入门到精通是一本面向初学python的人提供的最好教程,在书中作者以非常欢快的描述方式为读者讲解Python语言,以各种案例帮助你能够更简单的深入学习! 跟老齐学Python介 ...
- python编程从入门到精通pdf-跟老齐学Python:从入门到精通 完整版PDF[7MB]
<跟老齐学Python:从入门到精通>是面向编程零基础读者的Python入门教程,内容涵盖了Python的基础知识和初步应用.以比较轻快的风格,向零基础的学习者介绍一门时下比较流行.并且用 ...
- python编程从入门到精通pdf-终于晓得python编程从入门到精通
虽然在编程语言的热度榜上,还是java排行第一,但是python却是最近2年上升最快的,越来越多人都开始选择实用python了,原因很简单,语法语句简约,开发效率高.以下是小编为你整理的python编 ...
- python 量化分析 入门_【合辑·收藏】Python量化从入门到精通
原标题:[合辑·收藏]Python量化从入门到精通 引言 自2018年9月27日发第一篇推文以来,公众号"Python金融量化"专注于分享Python在金融量化领域的实战应用,坚持 ...
- python编程从入门到精通 叶维忠 pdf-零基础如何学习python?十本精品python书籍推荐...
你想要学习python编程,却不知道该看哪本书?今天小编精选了学习python的十本精品书籍,并且还编写了推荐理由分享给你,希望可以给有选择困难症的同学一点帮助! 1.<"笨办法学&q ...
- 【Python】Python实战从入门到精通之七 -- 教你深入理解异常处理
本文是<Python实战从入门到精通>系列之第7篇 [Python]Python实战从入门到精通之一 -- 教你深入理解Python中的变量和数据类型 [Python]Python实战从入 ...
- 【Python】Python实战从入门到精通之六 -- 教你读取文件
本文是<Python实战从入门到精通>系列之第6篇 [Python]Python实战从入门到精通之一 -- 教你深入理解Python中的变量和数据类型 [Python]Python实战从入 ...
最新文章
- Ubuntu 系统打不开图片提示Fatal error reading PNG image File: Not a PNG file
- 安卓手机可以连接斑马系统吗_斑马郝飞:我们一定能在车载系统上打败安卓
- 对英文文档中的单词与词组进行频率统计
- 直接拿来用!GitHub10个开源免费的后台管理面板
- 利用hutool工具类导出Excel
- boost.asio无锁异步并发
- Android笔记(十)ListView
- 国外工程师这样分析女人
- paip.使用继承机制来实现控制反转或依赖倒置
- 基于SSM实现的新闻发布系统【附源码】(毕设)
- 百面深度学习读书笔记-视频处理
- Python小白基础--集合set
- mysql改为sql_sql - 将MySQL列更改为AUTO_INCREMENT
- JAVA实现zip压缩/解压缩
- 南京那边可以学计算机绘画,电脑画画软件有哪些?推荐几款可以教画画的app
- Golang实习蓝湖二面
- Acer Aspire sw5-12安装系统(包含所有资源)|Acer sw系列装系统
- 如何检索论文时让两个词在一块而不是分开?
- ionic升华过程8-cordova插件+mui小案例
- python音频 降噪_谱减法语音降噪的Python实现教程