讲到机器学习,是离不开各种工具库的,特别是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机器学入门到精通(二)相关推荐

  1. 编程没基础学python多长时间--零基础学Python,从入门到精通需要多长时间

    求一份小甲鱼的<零基础入门学习Python>视频教程 评论 本系列教程面向础的同学,是一个深入浅通俗易懂的Python3视频教程. 适群 完全零基础入门,不需要任何前置知识. 教程概述 前 ...

  2. python从入门到精通需要多久--零基础学Python,从入门到精通需要多长时间

    求一份小甲鱼的<零基础入门学习Python>视频教程 评论 本系列教程面向础的同学,是一个深入浅通俗易懂的Python3视频教程. 适群 完全零基础入门,不需要任何前置知识. 教程概述 前 ...

  3. 零基础python从入门到精通 pdf-跟老齐学Python:从入门到精通PDF电子版

    跟老齐学Python:从入门到精通是一本面向初学python的人提供的最好教程,在书中作者以非常欢快的描述方式为读者讲解Python语言,以各种案例帮助你能够更简单的深入学习! 跟老齐学Python介 ...

  4. python编程从入门到精通pdf-跟老齐学Python:从入门到精通 完整版PDF[7MB]

    <跟老齐学Python:从入门到精通>是面向编程零基础读者的Python入门教程,内容涵盖了Python的基础知识和初步应用.以比较轻快的风格,向零基础的学习者介绍一门时下比较流行.并且用 ...

  5. python编程从入门到精通pdf-终于晓得python编程从入门到精通

    虽然在编程语言的热度榜上,还是java排行第一,但是python却是最近2年上升最快的,越来越多人都开始选择实用python了,原因很简单,语法语句简约,开发效率高.以下是小编为你整理的python编 ...

  6. python 量化分析 入门_【合辑·收藏】Python量化从入门到精通

    原标题:[合辑·收藏]Python量化从入门到精通 引言 自2018年9月27日发第一篇推文以来,公众号"Python金融量化"专注于分享Python在金融量化领域的实战应用,坚持 ...

  7. python编程从入门到精通 叶维忠 pdf-零基础如何学习python?十本精品python书籍推荐...

    你想要学习python编程,却不知道该看哪本书?今天小编精选了学习python的十本精品书籍,并且还编写了推荐理由分享给你,希望可以给有选择困难症的同学一点帮助! 1.<"笨办法学&q ...

  8. 【Python】Python实战从入门到精通之七 -- 教你深入理解异常处理

    本文是<Python实战从入门到精通>系列之第7篇 [Python]Python实战从入门到精通之一 -- 教你深入理解Python中的变量和数据类型 [Python]Python实战从入 ...

  9. 【Python】Python实战从入门到精通之六 -- 教你读取文件

    本文是<Python实战从入门到精通>系列之第6篇 [Python]Python实战从入门到精通之一 -- 教你深入理解Python中的变量和数据类型 [Python]Python实战从入 ...

最新文章

  1. Ubuntu 系统打不开图片提示Fatal error reading PNG image File: Not a PNG file
  2. 安卓手机可以连接斑马系统吗_斑马郝飞:我们一定能在车载系统上打败安卓
  3. 对英文文档中的单词与词组进行频率统计
  4. 直接拿来用!GitHub10个开源免费的后台管理面板
  5. 利用hutool工具类导出Excel
  6. boost.asio无锁异步并发
  7. Android笔记(十)ListView
  8. 国外工程师这样分析女人
  9. paip.使用继承机制来实现控制反转或依赖倒置
  10. 基于SSM实现的新闻发布系统【附源码】(毕设)
  11. 百面深度学习读书笔记-视频处理
  12. Python小白基础--集合set
  13. mysql改为sql_sql - 将MySQL列更改为AUTO_INCREMENT
  14. JAVA实现zip压缩/解压缩
  15. 南京那边可以学计算机绘画,电脑画画软件有哪些?推荐几款可以教画画的app
  16. Golang实习蓝湖二面
  17. Acer Aspire sw5-12安装系统(包含所有资源)|Acer sw系列装系统
  18. 如何检索论文时让两个词在一块而不是分开?
  19. ionic升华过程8-cordova插件+mui小案例
  20. python音频 降噪_谱减法语音降噪的Python实现教程

热门文章

  1. ZSV08-31、DHF08-231、SV08-B20M、LSV-08-2NCP-M插装式电磁阀Z
  2. 如果一个巨蟹座的人开始忙了……
  3. html中插入gif的代码,JavaScript插入动态样式实现代码
  4. 如何利用python实现简单的作图
  5. DJango项目实例_资产管理系统01
  6. SRv6的重要参考文献
  7. 技术如何创造新商业 新零售技术天团首次揭秘
  8. 256. Spinnaker介绍(企业级K8S自动化运维平台)
  9. 树莓派安装wiringPi库
  10. camunda 应用