接下来几周的文章我们会给大家主要介绍Pandas的使用,Pandas是一个Python 的包,提供快速、灵活和富有表现力的数据结构,旨在使"关系或标记数据的使用既简单又直观"。它的目标是成为用Python进行实际的、真实的数据分析的基础高级模块。
**Pandas的数据结构**,分两种:**Series**和**DataFrame**.
> 1、Series 一维,带标签数组 Series的中文意思是序列,系列.
> 2、DataFrame 二维,Series容器
本篇文章主要介绍Series的使用。:
#### Series简介
Serial对象本质上由两个数组构成,一个数组构成对象的健(index,索引),一个数组构成对象的值(values).因此Series可以看作是键值对。Series是**带标签**的一维数组,可存储整数、浮点数、字符串、Python 对象等类型的数据。轴标签统称为**索引,**它由两部分组成**。**
- values:一组数据(ndarray类型)
- index:相关的数据索引标签
如图:
特点:标签(index)与数据(value)默认对齐,除非特殊情况,一般不会断开连接,因此通过索引取值非常方便,不需要循环,可以直接通过字典方式,key 获取value.
#### Series 创建的几种方式
创建Series对象使用Pandas中的Series,
```
Series组成部分:pd.Series(data=None, index=None, dtype=None)
其中参数:data参数支持多种数据类型,比如列表,字典等,index是一个可选参数表示索引标签,通过dtype指定数据类型
```
Series的创建方式有多种:
> 1. 标量创建
> 2. 列表创建
> 3. numpy创建
> 4. 字典创建
**标量创建:**
```
import numpy as np
import pandas as pd
tes = pd.Series(10,index=list('abcde'))
tes
```
**列表创建**
即已知一个list结构的数据,通过该数据创建Series对象。
```
# lst = [11,0,3,7,9,19,4]
# s = pd.Series(lst) # 默认隐式索引
# s
lst = [11,0,3,7,9,19,4]
s = pd.Series(lst,index=["A","B","C","D","E","F","G"]) # 通过index设置显式索引
s
```
**numpy创建**
即Series中传入的是ndarray对象。
```
# data = np.random.randint(0,100,size=(6,))
# s = pd.Series(data=data)
# s
data = np.random.randint(0,100,size=(6,))
s = pd.Series(data=data,index=list('abcdef'))
s
```
结果:
**字典创建**
```
dic = {"A":1,"B":2,"C":3,"D":2}
s = pd.Series(dic) # 索引默认就是字典的key值
s
```
结果:
#### Series的索引和切片
因为Series只有一列,因此一般只对行进行操作,索引分为隐式索引和显示索引,因此不同的方式操作起来也不一样。
索引分别为哪些呢?
> 1. 位置下标
>
> 2. 标签索引
> 3. 布尔型索引
> 4. 切片索引
位置下标:当使用默认值索引的时候,通常使用位置下标。类似列表的索引使用方式
```
data = np.random.randint(0,100,size=(6,))
s = pd.Series(data=data)
print(s[0])
print(s[3])
print(s[4])
```
标签索引:类似字典通过key获取value的方式,通常用在显示索引的时候。
```
data = np.random.randint(0,100,size=(6,))
s = pd.Series(data=data,index=list('abcdef'))
print(s['a'])
print(s['f'])
print(s['c'])
```
布尔型索引: 通过一个布尔型的数组获取Series对象中的值。
```
data = np.random.randint(0,100,size=(6,))
s = pd.Series(data=data,index=list('abcdef'))
print(s)
s2 = s>50 # 获取s中大于50的元素,结果会是一个bool类型的数组
print(s2) # 打印s2得到的是一个bool类型的数组
print(s[s2]) # 通过s2这个bool数组获取s中的元素
```
结果:
切片索引:即切片,类似列表的切片使用,但是又有所区别。
隐式索引的使用:
```
data = np.random.randint(0,100,size=(6,))
s = pd.Series(data=data)
print(s)
print(s[1:5])
print(s[:4])
print(s[2:])
print(s[::2])
```
结果:
当然也可以使用iloc完成Series对象中元素的获取,使用方式如下:
```
data = np.random.randint(0,100,size=(6,))
s = pd.Series(data=data)
print(s.iloc[2]) # 指定下标
print(s.iloc[1:3]) # 指定切片范围
```
结果:
显示索引的切片使用
```
data = np.random.randint(0,100,size=(6,))
s = pd.Series(data=data,index=list('abcdef'))
print(s)
print(s['a':'d'])
print(s['a':])
print(s[:'f'])
print(s[::2])
```
结果:
显示索引也可以使用loc的方式获取元素
```
print(s.loc['a':'e'])
print(s.loc[['a','c','f']])
```
结果:
总结:
1. **Series的索引和切片只针对行而言,因为它只有一列**
2. **loc是对于显式索引的相关操作(对于标签的处理),iloc是针对隐式索引的相关操作(对于整数的处理)。**
3. **我们发现其实s[0:2] 与 s.iloc[0:2]没有太大差别(显式索引也是一样),这并不说明iloc就没有用,个人觉得它更有意义的是在DataFrame当中使用**
#### Series的基本使用
**显示Series部分数据内容**
**s.head(n)** 该函数代表的意思是显示前多少行,可以指定显示的行数,不写n默认是前5行
**s.tail(n)** 该函数代表的意思是显示后多少行,可以指定显示的行数,不写n默认是前5行
**s.unique()** 去除重复的值
**s.notnull()** 不为空返回True,为空返回False
**s.isnull()** 不为空返回False,为空返回True
```text
lst = [1,3,5,6,10,23]
s1 = pd.Series(lst,index=["A","B","C","D","E","F"])
print(s1.head()) # 获取前5行
print(s1.tail()) # 获取后5行
print(s1.unique()) # 去除重复的值
s1['D']=None # 修改D索引对应的值为None
print(s1.isnull()) # 判断是否有空值
print(s1.notnull()) # 判断是否有非空值
```
结果: