IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python机器学习pandas库学习笔记一 -> 正文阅读

[Python知识库]python机器学习pandas库学习笔记一

在这里插入图片描述

为什么要学习pandas?

那么问题来了:

numpy已经能够帮助我们处理数据,能够结合matplotlib解决我们数据分析的问题,那么pandas学习的目的在什么地方呢?

numpy能够帮我们处理处理数值型数据,但是这还不够, 很多时候,我们的数据除了数值之外,还有字符串,还有时间序列等。

比如:我们通过爬虫获取到了存储在数据库中的数据

所以,pandas出现了。

什么是Pandas?

Pandas的名称来自于面板数据(panel data)

Pandas是一个强大的分析结构化数据的工具集,基于NumPy构建,提供了高级数据结构和数据操作工具,它是使Python成为强大而高效的数据分析环境的重要因素之一。

  • 一个强大的分析和操作大型结构化数据集所需的工具集

  • 基础是NumPy,提供了高性能矩阵的运算

  • 提供了大量能够快速便捷地处理数据的函数和方法

  • 应用于数据挖掘,数据分析

  • 提供数据清洗功能

Pandas的数据结构:

import pandas as pd

Pandas有两个最主要也是最重要的数据结构: SeriesDataFrame

官网:

http://pandas.pydata.org/

目录

Series

Series是一种一维标记的数组型对象,能够保存任何数据类型(int, str, float, python object…),包含了数据标签,称为索引。

  • 类似一维数组的对象,index =['名字,‘年龄’,‘班级’]
  • 由数据和索引组成
  • 索引(index)在左,数据(values)在右
  • 索引是自动创建的(也可以自己指定)
    在这里插入图片描述

Series创建

  1. 通过list创建
import pandas as pd
import numpy as np
# 2.1 通过list创建
s1 = pd.Series([1,2,3,4,5])
s1

结果:

0    1
1    2
2    3
3    4
4    5
dtype: int64
  1. 通过数组创建
# 2.2 通过数组创建
arr1 = np.arange(1,6)
print(arr1)
s2 = pd.Series(arr1)
s2

结果:

[1 2 3 4 5]
0    1
1    2
2    3
3    4
4    5
dtype: int32

指定索引名称:

#索引长度和数据长度必须相同。
s2 = pd.Series(arr1,index=['a','b','c','d','e'])
s2

结果:

a    1
b    2
c    3
d    4
e    5
dtype: int32

属性index和values

print(s1.values)
print('='*30)
print(s1.index)
[1 2 3 4 5]
==============================
RangeIndex(start=0, stop=5, step=1)
  1. 通过字典创建
# 2.3 通过字典创建
dict = {'name':'李宁','age':18,'class':'三班'}
s3 = pd.Series(dict,index = ['name','age','class','sex'])
s3

结果:

name      李宁
age       18
class     三班
sex      NaN
dtype: object

Series的基本用法

  1. isnull 和 notnull 检查缺失值
# isnull 和 notnull 检查缺失值
print(s3.isnull())  #判断是否为空  空就是True
print('='*30)
print(s3.notnull()) #判断是否不为空  非空True

结果:

name     False
age      False
class    False
sex       True
dtype: bool
==============================
name      True
age       True
class     True
sex      False
dtype: bool
  1. 通过索引获取数据
print(s3)
print('='*30)
# 下标
print(s3[0])
print('='*30)
# 标签名
print(s3['age'])
print('='*30)
# 选取多个
print(s3[['name','age']])  # s3[[1,3]]
print('='*30)
# 切片
print(s3[1:3])
print('='*30)
print(s3['name':'class'])   #标签切片 包含末端数据
print('='*30)
#布尔索引
print(s2[s2>3])

结果:

name      李宁
age       18
class     三班
sex      NaN
dtype: object
==============================
李宁
==============================
18
==============================
name    李宁
age     18
dtype: object
==============================
age      18
class    三班
dtype: object
==============================
name     李宁
age      18
class    三班
dtype: object
==============================
3    4
4    5
dtype: int32
  1. 索引与数据的对应关系不被运算结果影响
#索引与数据的对应关系不被运算结果影响
print(s2+2)
print('='*30)
print(s2>2)

结果:

0    3
1    4
2    5
3    6
4    7
dtype: int32
==============================
0    False
1    False
2     True
3     True
4     True
dtype: bool
  1. name属性
s2.name = 'temp'  #对象名
s2.index.name = 'year'  #对象的索引名
s2

结果:

year
a    1
b    2
c    3
d    4
e    5
Name: temp, dtype: int32
  1. head和tail方法
print(s2.head(3))  #无参数默认前5print('='*30)
print(s2.tail(2))  #无参数尾部默认后5

结果:

0    1
1    2
2    3
dtype: int32
==============================
3    4
4    5
dtype: int32

DateFrame

DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同类型的值。DataFrame既有行索引也有列索引,它可以被看做是由Series组成的字典(共用同一个索引),数据是以二维结构存放的。

  • 类似多维数组/表格数据(如,excel,R中的data.frame)
  • 每列数据可以是不同的类型
  • 索引包括列索引和行索引
    在这里插入图片描述

DateFrame构建

字典类:

  • 数组、列表或元组构成的字典构造dataframe

  • Series构成的字典构造dataframe

  • 字典构成的字典构造dataframe

列表类:

  • 2D ndarray 构造dataframe

  • 字典构成的列表构造dataframe

  • Series构成的列表构造dataframe


数组、列表或元组构成的字典构造dataframe

import numpy as np
import pandas as pd
# 数组、列表或元组构成的字典构造dataframe
#构造一个字典
data = {'a':[1,2,3,4],
        'b':(5,6,7,8),
       'c':np.arange(9,13)}
#构造dataframe
frame = pd.DataFrame(data)
frame

结果:
在这里插入图片描述
一些属性操作:

#index属性查看行索引
print(frame.index)
print('='*30)
#columns属性查看列索引
print(frame.columns)
print('='*30)
#values属性查看值
print(frame.values)
print('='*30)
#指定index
frame = pd.DataFrame(data,index=['A','B','C','D'])
print(frame)
print('='*30)
#指定列索引
frame = pd.DataFrame(data,index=['A','B','C','D'],columns=['a','b','c','d'])#若指定多余的列,则那一列值为NAN
print(frame)

结果:

RangeIndex(start=0, stop=4, step=1)
==============================
Index(['a', 'b', 'c'], dtype='object')
==============================
[[ 1  5  9]
 [ 2  6 10]
 [ 3  7 11]
 [ 4  8 12]]
==============================
   a  b   c
A  1  5   9
B  2  6  10
C  3  7  11
D  4  8  12
==============================
   a  b   c    d
A  1  5   9  NaN
B  2  6  10  NaN
C  3  7  11  NaN
D  4  8  12  NaN

Series构成的字典构造dataframe

#2.Series构成的字典构造dataframe
pd1 = pd.DataFrame({'a':pd.Series(np.arange(3)),
                   'b':pd.Series(np.arange(3,5))})
print(pd1)

结果:

   a    b
0  0  3.0
1  1  4.0
2  2  NaN

字典构成的字典构造dataframe

#3.字典构成的字典构造dataframe
#字典嵌套
data1 = {
    'a':{'apple':3.6,'banana':5.6},
    'b':{'apple':3,'banana':5},
    'c':{'apple':3.2}
}
pd2 = pd.DataFrame(data1)
print(pd2)

结果:

   a  b    c
apple   3.6  3  3.2
banana  5.6  5  NaN

2D ndarray 构造dataframe

#构造二维数组对象
arr1 = np.arange(12).reshape(4,3)

frame1 = pd.DataFrame(arr1)
print(frame1)

结果:

 0   1   2
0  0   1   2
1  3   4   5
2  6   7   8
3  9  10  11

字典构成的列表构造dataframe

l1 = [{'apple':3.6,'banana':5.6},{'apple':3,'banana':5},{'apple':3.2}]
pd3 = pd.DataFrame(l1)
pd3

结果:

在这里插入图片描述


Series构成的列表构造dataframe

l2 = [pd.Series(np.random.rand(3)),pd.Series(np.random.rand(2))]
pd4 = pd.DataFrame(l2)
print(pd4)

结果:

          0         1         2
0  0.479686  0.107307  0.908551
1  0.032230  0.626875       NaN

DataFrame的基本用法

  1. T转置
  2. 通过列索引获取列数据(Series类型)
  3. 增加列数据
  4. 删除列

T转置

#dataframe
pd5 = pd.DataFrame(np.arange(9).reshape(3,3),index=['a','c','b'],columns=['A','B','C'])
print(pd5)

结果:

A  B  C
a  0  1  2
c  3  4  5
b  6  7  8

#和numpy一样 进行转置   行与列进行转置
print(pd5.T)

结果:

  a  c  b
A  0  3  6
B  1  4  7
C  2  5  8

通过列索引获取列数据(Series类型)

pd5['A']
print(type(pd5['A']))

结果:

<class 'pandas.core.series.Series'>

增加列数据

pd5['D'] = [1,2,3]
print(pd5)

结果:

 A  B  C  D
a  0  1  2  1
c  3  4  5  2
b  6  7  8  3

删除列

del(pd5['D'])
print(pd5)

结果:

A  B  C
a  0  1  2
c  3  4  5
b  6  7  8

Pandas的索引操作

索引对象Index

1. Series和DataFrame中的索引都是Index对象

代码举例:

import numpy as np
import pandas as pd
ps1 = pd.Series(range(5),index=['a','b','c','d','e'])
print(type(ps1.index))
print('='*30)
pd1 = pd.DataFrame(np.arange(9).reshape(3,3),index = ['a','b','c'],columns = ['A','B','C'])
print(type(pd1.index))

结果:

<class 'pandas.core.indexes.base.Index'>
==============================
<class 'pandas.core.indexes.base.Index'>

2. 索引对象不可变,保证了数据的安全

代码举例:

pd1.index[1] = 2
pd1

结果:

TypeError                                 Traceback (most recent call last)
<ipython-input-16-8d21a7039bc5> in <module>()
----> 1 pd1.index[1] = 2

D:\Anaconda\lib\site-packages\pandas\core\indexes\base.py in __setitem__(self, key, value)
   1668 
   1669     def __setitem__(self, key, value):
-> 1670         raise TypeError("Index does not support mutable operations")
   1671 
   1672     def __getitem__(self, key):

TypeError: Index does not support mutable operations

常见的Index种类

  • Index,索引
  • Int64Index,整数索引
  • MultiIndex,层级索引
  • DatetimeIndex,时间戳类型

Series索引

  1. index 指定行索引名
ser_obj = pd.Series(range(5), index = ['a', 'b', 'c', 'd', 'e'])
print(ser_obj.head())

结果:

a    0
b    1
c    2
d    3
e    4
dtype: int64
  1. 行索引

ser_obj[‘label’]

ser_obj[pos]

# 行索引
print(ser_obj['b'])
print(ser_obj[2])

结果:

1
2
  1. 切片索引

ser_obj[2:4]

ser_obj[‘label1’: ’label3’]

注意,按索引名切片操作时,是包含终止索引的。

代码举例:

# 切片索引
print(ser_obj[1:3])
print(ser_obj['b':'d'])

结果:

b    1
c    2
dtype: int64
b    1
c    2
d    3
dtype: int64
  1. 不连续索引

ser_obj[[‘label1’, ’label2’, ‘label3’]]

ser_obj[[0,1,2]]

代码举例:

# 不连续索引
print(ser_obj[[0, 2, 4]])
print(ser_obj[['a', 'e']])

结果:

a    0
c    2
e    4
dtype: int64
a    0
e    4
dtype: int64
  1. 布尔索引
# 布尔索引
ser_bool = ser_obj > 2
print(ser_bool)
print(ser_obj[ser_bool])

print(ser_obj[ser_obj > 2])

结果:

a    False
b    False
c    False
d     True
e     True
dtype: bool
d    3
e    4
dtype: int64
d    3
e    4
dtype: int64

DataFrame索引

  1. columns 指定列索引名

import numpy as np

df_obj = pd.DataFrame(np.random.randn(5,4), columns = ['a', 'b', 'c', 'd'])
print(df_obj.head())

结果:

 a         b         c         d
0 -0.241678  0.621589  0.843546 -0.383105
1 -0.526918 -0.485325  1.124420 -0.653144
2 -1.074163  0.939324 -0.309822 -0.209149
3 -0.716816  1.844654 -2.123637 -1.323484
4  0.368212 -0.910324  0.064703  0.486016

在这里插入图片描述

  1. 列索引

df_obj[[‘label’]]

示例代码:

# 列索引
print(df_obj['a']) # 返回Series类型

结果:

0   -0.241678
1   -0.526918
2   -1.074163
3   -0.716816
4    0.368212
Name: a, dtype: float64
  1. 不连续索引

df_obj[[‘label1’, ‘label2’]]

代码举例:

# 不连续索引
print(df_obj[['a','c']])

结果:

       a         c
0 -0.241678  0.843546
1 -0.526918  1.124420
2 -1.074163 -0.309822
3 -0.716816 -2.123637
4  0.368212  0.064703

高级索引:标签、位置和混合(不建议使用,不再展开讨论)

Pandas的高级索引有3种

1. loc 标签索引

DataFrame 不能直接切片,可以通过loc来做切片
loc是基于标签名的索引,也就是我们自定义的索引名

代码举例:

# 标签索引 loc
# Series
print(ser_obj['b':'d'])
print(ser_obj.loc['b':'d'])

# DataFrame
print(df_obj['a'])

# 第一个参数索引行,第二个参数是列
print(df_obj.loc[0:2, 'a'])

结果:

b    1
c    2
d    3
dtype: int64
b    1
c    2
d    3
dtype: int64

0   -0.241678
1   -0.526918
2   -1.074163
3   -0.716816
4    0.368212
Name: a, dtype: float64
0   -0.241678
1   -0.526918
2   -1.074163
Name: a, dtype: float64

2.位置索引

作用和loc一样,不过是基于索引编号来索引

示例代码:

# 整型位置索引 iloc
# Series
print(ser_obj[1:3])
print(ser_obj.iloc[1:3])

# DataFrame
print(df_obj.iloc[0:2, 0]) # 注意和df_obj.loc[0:2, 'a']的区别,包括不包括的问题

结果:

b    1
c    2
dtype: int64
b    1
c    2
dtype: int64

0   -0.241678
1   -0.526918
Name: a, dtype: float64

注意:

标签的切片索引是包含末尾位置的

索引的一些基本操作

  1. 重建索引


import numpy as np
import pandas as pd
ps1 = pd.Series(range(5),index=[‘a’,‘b’,‘c’,‘d’,‘e’])
print(ps1)
print(’=’*30)
pd1 = pd.DataFrame(np.arange(9).reshape(3,3),index = [‘a’,‘b’,‘c’],columns = [‘A’,‘B’,‘C’])
print(pd1)

结果:

a 0
b 1
c 2
d 3
e 4
dtype: int64
==============================
A B C
a 0 1 2
b 3 4 5
c 6 7 8

1.重建索引

对于Series

#1.reindex 创建一个符合新索引的新对象
ps2 = ps1.reindex(['a','b','c','d','e','f'])#必须是原本有的加上没有的列名
ps2

结果:

a    0.0
b    1.0
c    2.0
d    3.0
e    4.0
f    NaN
dtype: float64

对于dataframe

#行索引重建
pd2 = pd1.reindex(['a','b','c','d'])
pd2

结果:
在这里插入图片描述

#列索引重建
pd3 = pd1.reindex(columns = ['C','B','A'])
pd3

结果:
在这里插入图片描述

2.增

对于series

ps1

结果:

a    0
b    1
c    2
d    3
e    4
dtype: int32

ps1['g'] = 9
ps1

结果:

a    0
b    1
c    2
d    3
e    4
g    9
dtype: int64

若不想直接操作原对象:

s1 = pd.Series({'f':999})
ps3 = ps1.append(s1)
ps3

结果:

a      0
b      1
c      2
d      3
e      4
g      9
f    999
dtype: int64

对于dataframe

pd1

结果:
在这里插入图片描述

#增加列
pd1[4] = [10,11,12]
pd1

结果:
在这里插入图片描述

# 插入
pd1.insert(0,'E',[9,99,999])#在第1列插入
pd1

结果:

在这里插入图片描述
增加行

#标签索引loc
pd1.loc['d'] = [1,1,1,1,1]
pd1

结果:

在这里插入图片描述

row = {'E':6,'A':6,'B':6,'C':6,4:6}
pd5 = pd1.append(row,ignore_index=True)
#ignore_index 参数默认值为False,如果为True,会对新生成的dataframe使用新的索引(自动产生),忽略原来数据的索引。
pd5

结果:
在这里插入图片描述

3.删

对于series

#del
ps1

结果:

a    0
b    1
c    2
d    3
e    4
g    9
dtype: int64

del ps1['b']
ps1

结果:

a    0
c    2
d    3
e    4
g    9
dtype: int64

对于dataframe

pd1

结果:
在这里插入图片描述

del pd1['E']
pd1

结果:
在这里插入图片描述
drop函数:删除轴上的数据,默认非原地操作,可通过属性进行修改
在这里插入图片描述

#drop  删除轴上数据
#删除一条
ps6 = ps1.drop('g')
ps6

结果:

a    0
c    2
d    3
e    4
dtype: int64

#删除多条
ps1.drop(['c','d'])

结果:

a    0
e    4
g    9
dtype: int64

#dataframe
#删除行
pd1.drop('a')

结果:
在这里插入图片描述

pd1.drop(['a','d'])

结果:
在这里插入图片描述

#删除列
pd1.drop('A',axis=1)  #10

结果:

在这里插入图片描述

pd1.drop('A',axis='columns')

结果:

在这里插入图片描述

#inplace属性   在原对象上删除,并不会返回新的对象
ps1

结果:

a    0
c    2
d    3
e    4
g    9
dtype: int64

ps1.drop('d',inplace=True)
ps1

结果:

a    0
c    2
e    4
g    9
dtype: int64

4.改

ps1 = pd.Series(range(5),index=['a','b','c','d','e'])
print(type(ps1.index))
ps1

结果:

<class 'pandas.core.indexes.base.Index'>
a    0
b    1
c    2
d    3
e    4
dtype: int32

pd1 = pd.DataFrame(np.arange(9).reshape(3,3),index = ['a','b','c'],columns = ['A','B','C'])
pd1

结果:
在这里插入图片描述

ps1['a'] = 999
ps1

结果:

a    999
b      1
c      2
d      3
e      4
dtype: int32

ps1[0] = 888
ps1

结果:

a    888
b      1
c      2
d      3
e      4
dtype: int32

对于dataframe操作:

#直接使用索引
pd1['A'] = [9,10,11]
pd1

结果:

在这里插入图片描述

# 变成增加列的操作
pd1['a'] = 777
pd1

结果:

在这里插入图片描述

#loc 标签索引
pd1.loc['a'] =777#增加索引为a的这一行
pd1

在这里插入图片描述

pd1.loc['a','A'] = 1000#修改单个值
pd1

结果:
在这里插入图片描述

5.查

对于series

#Series
# 1.行索引
ps1

结果:

a    888
b      1
c      2
d      3
e      4
dtype: int32

print(ps1['a'])
print('='*30)
print(ps1[0])

结果:

888
==============================
888

…请参考series基本操作


对于dataframe

pd1

结果:
在这里插入图片描述

#取多列
pd1[['A','C']]

结果:
在这里插入图片描述

#选取一个值
pd1['A']['a']

结果:

1000

#2.切片
pd1[:2]  #获取行

结果:
在这里插入图片描述
…对于截取部分操作请参考loc和iloc

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-08-10 13:22:40  更:2021-08-10 13:23:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 12:13:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码