六、Pandas 教程
什么是Pandas
Pandas(Python Data Analysis Library)是基于NumPy 的为了解决数据分析任务而创建的一种工具,Pandas 纳入 了大量库和一些标准的数据模型,提供了高效地操作大型结构化数据集所需的工具。
Pandas 一个强大的分析结构化数据的工具集,基础是 Numpy
(提供高性能的矩阵运算)。
Pandas 可以从各种文件格式比如 CSV、JSON、SQL、Microsoft Excel 导入数据。
Pandas 可以对各种数据进行运算操作,比如归并、再成形、选择,还有数据清洗和数据加工特征。
Pandas 广泛应用在学术、金融、统计学等各个数据分析领域。
pandas的核心延续了numpy当中的属性和方法,numpy的属性方法在 pandas中都可以使用如(.shape、 .dtype、 .ndim)
pandas 使用结构化数据集,结构化数据集类似于MYSQL关系型数据库的结构(有行有列)
如:
姓名 | 语文成绩 | 数学成绩 |
---|---|---|
张三 | 70 | 80 |
李四 | 100 | 90 |
王五 | 60 | 99 |
1. 安装 pandas
- 在Windows 下安装pandas
# 安装 pandas
pip install -i https://mirrors.aliyun.com/pypi/simple/ pandas==1.0.1
- 在Mac OS/Linux 下安装pandas
# 安装 pandas
sudo pip3 install -i https://mirrors.aliyun.com/pypi/simple/ pandas==1.0.1
2. pandas核心数据结构
数据结构是计算机存储、组织数据的方式。 通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。
pandas核心数据结构有两种:
-
Series(系列)
类似于numpy中的一维数组。
-
DataFrame (数据帧)
类似于numpy中的二维数组。
3. Series
Series可以理解为一个一维的数组,index名称可以自己改动。类似于定长的有序字典,有Index 和 value。
Series对象的创建
创建函数pandas.Series():
pandas.Series(
data=数据, # 类数组, 可迭代对象, 字典或标量值
index=索引, # 类数组等,默认是range(n)
dtype=类型, # 类型: numpy.dtype
name='名称' # str
copy=False # 是否复制data的数据(默认False)
)
示例:
import numpy as np
import pandas as pd
# 创建一个空的Series
s = pd.Series(dtype='int32')
print(s)
# 从ndarray创建一个Series
data = np.array(['张三', '李四', '王五', '赵柳'])
s = pd.Series(data)
print(s)
s = pd.Series(data, index=['100', '101', '102', '103'])
# 从字典创建一个Series
data = {
'100': '张三', '101': '李四', '102': '王五'}
s = pd.Series(data)
print(s)
# 从标量创建一个Series
s = pd.Series(999, index=[0, 1, 2, 5], dtype='f8')
print(s)
Series对象的数据访问
Series对象可以使用整数索引、索引标签 、切片访问数据
import pandas as pd
# 使用索引获取数据元素
s = pd.Series([1, 2, 3, 4, 5],
index=['a', 'b', 'c', 'd', 'e'])
print(s[2]) # 使用整数索引访问数据
print(s['a']) # 使用标签索引访问数据
# 使用标签索引获取数据
print(s[['a', 'c', 'd']]) # 使用标签列表获取数据
print(s[[3, 1, 4]]) # 使用整数索引列表获取数据
# 切片操作
print(s[:3])
print(s[-3:])
Series常用属性
属性 | 说明 |
---|---|
series.values | 返回ndarray |
series.index | 返回索引序列 |
series.dtype | 返回数据类型 |
series.size | 返回元素个数 |
series.ndim | 返回维数 |
series.shape | 返回维度(形状) |
示例:
import pandas as pd
# 使用索引获取数据元素
s = pd.Series([2, 3, 5, 7],
index=['a', 'b', 'c', 'd'])
print(s.values) # [2 3 5 7] , numpy.ndarray 类型
print(s.index) # Index(['a', 'b', 'c', 'd'],
# dtype='object')
print(s.dtype) # int64
print(s.size) # 4
print(s.shape) # (4,)
print(s.ndim) # 1
4. pandas日期时间类型
pandas支持多种格式字符串数据转换为日期类型数据:
Pandas 提供的 日期时间转换函数pd.to_datetime()
import pandas as pd
pd.to_datetime(
arg # 日期字符串或者 日期字符串的元组或者列表
)
返回值:
如果 arg 是一个字符串,返回一个 日期时间戳
如果 arg 是日期字符串的元组或者列表,则返回含有日期时间戳的DatetimeIndex 数组对象
示例
import pandas as pd
# pandas识别的日期字符串格式
str_list = ['2011', '2012-02', '2013-03-05',
'2014/04/08', '2015/05/01 01:01:01',
'01 Jun 2016']
# 使用 pd.to_datetime() 转换日期数据类型的 DatetimeIndex([...])
dates_array = pd.to_datetime(str_list)
# 用 DatetimeIndex 生成一个含有一系列时间的 Series
dates = pd.Series(dates_array)
print(dates)
# 获取时间的某个日期 相关数据的数值
print(dates.dt.year)
series.dt 属性
Series.dt提供了大量日期字段可供访问:
属性 | 说明 |
---|---|
Series.dt.year | The year of the datetime. |
Series.dt.month | The month as January=1, December=12. |
Series.dt.day | The days of the datetime. |
Series.dt.hour | The hours of the datetime. |
Series.dt.minute | The minutes of the datetime. |
Series.dt.second | The seconds of the datetime. |
Series.dt.microsecond | The microseconds of the datetime. |
Series.dt.week | The week ordinal of the year. |
Series.dt.weekofyear | The week ordinal of the year. |
Series.dt.dayofweek | The day of the week with Monday=0, Sunday=6. |
Series.dt.weekday | The day of the week with Monday=0, Sunday=6. |
Series.dt.dayofyear | The ordinal day of the year. |
Series.dt.quarter | The quarter of the date. |
Series.dt.is_month_start | Indicates whether the date is the first day of the month. |
Series.dt.is_month_end | Indicates whether the date is the last day of the month. |
Series.dt.is_quarter_start | Indicator for whether the date is the first day of a quarter. |
Series.dt.is_quarter_end | Indicator for whether the date is the last day of a quarter. |
Series.dt.is_year_start | Indicate whether the date is the first day of a year. |
Series.dt.is_year_end | Indicate whether the date is the last day of the year. |
Series.dt.is_leap_year | Boolean indicator if the date belongs to a leap year. |
Series.dt.days_in_month | The number of days in the month. |
pandas日期计算
pandas支持计算两日期间的偏移时间:
示例:
import pandas as pd
# pandas识别的日期字符串格式
str_list = ['2011', '2012-02', '2013-03-05',
'2014/04/08', '2015/05/01 01:01:01',
'01 Jun 2016']
# to_datetime() 转换日期数据类型的 DatetimeIndex([...])
date_array = pd.to_datetime(str_list)
# 创建一个时间戳
cur_date = pd.to_datetime('2010-1-1')
# 计算 dates_array 中所有时间与 cur_date 的时间差
delta_days = dates_array - cur_date
print(delta_days)
delta_s = pd.Series(delta_days)
print(delta_s.dt.days) # 获取时间差的 天数的 Series
print(delta_s.dt.seconds) # 获取时间差的 秒数的 Series
生成一组时间序列
通过指定周期和频率,使用date_range()函数就可以创建日期序列。 默认情况下,频率是’D’(即以Day为单位)。
函数
pandas.date_range(
start=开始时间, # str or datetime-like, optional
end=截止时间, # str or datetime-like, optional
periods=周期, # int, optional
freq='间隔' # str or DateOffset, default 'D'
)
返回值 : 固定频率的 DatetimeIndex.
示例:
import pandas as pd
# 以日为频率
datelist = pd.date_range('2021/01/1', periods=5)
print(datelist)
# 以月为频率