Pandas二次学习- 回炉重造(进阶)

Posted ZSYL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Pandas二次学习- 回炉重造(进阶)相关的知识,希望对你有一定的参考价值。

Pandas介绍

在这里插入图片描述

  • 2008年WesMcKinney开发出的库
  • 专门用于数据挖掘的开源python
  • Numpy为基础,借力Numpy模块在计算方面性能高的优势
  • 基于matplotlib,能够简便的画图
  • 独特的数据结构

学Python怎么能不会数据分析?(Pandas超详解)

为什么使用Pandas

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

  • 增强图表可读性
  • 回忆我们在numpy当中创建学生成绩表样式:
  • 返回结果:

在这里插入图片描述
如果数据展示为这样,可读性就会更友好:

在这里插入图片描述

  • 便捷的数据处理能力

在这里插入图片描述

  • 读取文件方便
  • 封装了Matplotlib、Numpy的画图和计算

Pandas数据结构

Pandas中一共有三种数据结构,分别为:SeriesDataFrameMultiIndex(老版本中叫Panel )。

其中Series是一维数据结构,DataFrame是二维的表格型数据结构,MultiIndex是三维的数据结构。

Series

Series是一个类似于一维数组的数据结构,它能够保存任何类型的数据,比如整数、字符串、浮点数等,主要由一组数据和与之相关的索引两部分构成。

在这里插入图片描述

Series的创建

# 导入pandas 
import pandas as pd 
pd.Series(data=None, index=None, dtype=None)
  • 参数
    • data:传入的数据,可以是ndarray、list等
    • index:索引,必须是唯一的,且与数据的长度相等。如果没有传入索引参数,则默认会自动创建一个从0-N的整数索引。
    • dtype:数据的类型

通过已有数据创建

  • 指定内容,默认索引
pd.Series(np.arange(10))
  • 指定索引
pd.Series([6.7,5.6,3,10,2], index=[1,2,3,4,5])
  • 通过字典数据创建
color_count = pd.Series({'red':100, 'blue':200, 'green': 500, 'yellow':1000})

Series的属性

为了更方便地操作Series对象中的索引和数据,Series中提供了两个属性indexvalues

DataFrame

DataFrame是一个类似于二维数组或表格(如excel)的对象,既有行索引,又有列索引

  • 行索引,表明不同行,横向索引,叫index,0轴,axis=0
  • 列索引,表名不同列,纵向索引,叫columns,1轴,axis=1

在这里插入图片描述

DataFrame的创建

# 导入pandas 
import pandas as pd 
pd.DataFrame(data=None, index=None, columns=None)
  • 参数:
    • index:行标签。如果没有传入索引参数,则默认会自动创建一个从0-N的整数索引。
    • columns:列标签。如果没有传入索引参数,则默认会自动创建一个从0-N的整数索引。
  • 通过已有数据创建

举例一:

pd.DataFrame(np.random.randn(2,3))

在这里插入图片描述
举例二:创建学生成绩表

# 生成10名同学,5门功课的数据 
score = np.random.randint(40, 100, (10, 5))

在这里插入图片描述
但是这样的数据形式很难看到存储的是什么的样的数据,可读性比较差!!

问题:如何让数据更有意义的显示?

# 使用Pandas中的数据结构 
score_df = pd.DataFrame(score)

在这里插入图片描述
给分数数据增加行列索引,显示效果更佳

# 构造行索引序列 
subjects = ["语文", "数学", "英语", "政治", "体育"] 
# 构造列索引序列 
stu = ['同学' + str(i) for i in range(score_df.shape[0])] 
# 添加行索引 
data = pd.DataFrame(score, columns=subjects, index=stu)

DataFrame的属性

  • shape
  • index
    DataFrame的行索引列表
  • columns
    DataFrame的列索引列表
  • values
    直接获取其中array的值
  • T
    转置
  • head(5)
    显示前5行内容
    如果不补充参数,默认5行。填入参数N则显示前N行
  • tail(5)
    显示后5行内容

DatatFrame索引的设置

修改行列索引值

stu = ["学生_" + str(i) for i in range(score_df.shape[0])] 
# 必须整体全部修改 
data.index = stu

注意:以下修改方式是错误的

# 错误修改方式 
data.index[3] = '学生_3'

重设索引

  • reset_index(drop=False)
    • 设置新的下标索引
    • drop:默认为False,不删除原来索引,如果为True,删除原来的索引值

以某列值设置为新的索引

  • set_index(keys, drop=True)
    • keys : 列索引名成或者列索引名称的列表
    • drop : boolean, default True.当做新的索引,删除原来的列

在这里插入图片描述

注:通过刚才的设置,这样DataFrame就变成了一个具有MultiIndex的DataFrame

MultiIndex

MultiIndex是三维的数据结构;

多级索引(也称层次化索引)是pandas的重要功能,可以在Series、DataFrame对象上拥有2个以及2个以上的索引。

multiIndex的特性

打印刚才的df的行索引结果

df.index 

MultiIndex(levels=[[2012, 2013, 2014], [1, 4, 7, 10]], 
labels=[[0, 2, 1, 2], [0, 1, 2, 3]], 
names=['year', 'month'])

多级或分层索引对象。

  • index属性
    • names:levels的名称
    • levels:每个level的元组值
df.index.names 
# FrozenList(['year', 'month']) 

df.index.levels 
# FrozenList([[1, 2], [1, 4, 7, 10]])

multiIndex的创建

arrays = [[1, 1, 2, 2], ['red', 'blue', 'red', 'blue']] 
pd.MultiIndex.from_arrays(arrays, names=('number', 'color')) 

# 结果 
MultiIndex(levels=[[1, 2], ['blue', 'red']], 
codes=[[0, 0, 1, 1], [1, 0, 1, 0]], 
names=['number', 'color'])

Panel

panel的创建

  • class pandas.Panel (data=None, items=None, major_axis=None, minor_axis=None)
  • 作用:存储3维数组的Panel结构
  • 参数:
    • data : ndarray或者dataframe
    • items : 索引或类似数组的对象,axis=0
    • major_axis : 索引或类似数组的对象,axis=1
    • minor_axis : 索引或类似数组的对象,axis=2

在这里插入图片描述

查看panel数据

p[:,:,"first"] 
p["B",:,:]

panel数据要是想看到,则需要进行索引到dataframe或者series才可以

注:Pandas从版本0.20.0开始弃用:推荐的用于表示3D数据的方法是通过DataFrame上的MultiIndex方法

基本数据操作

为了更好的理解这些基本操作,我们将读取一个真实的股票数据。关于文件操作,后面在介绍,这里只先用一下API

# 读取文件 
data = pd.read_csv("./data/stock_day.csv") 
# 删除一些列,让数据更简单些,再去做后面的操作 
data = data.drop(["ma5","ma10","ma20","v_ma5","v_ma10","v_ma20"], axis=1)

在这里插入图片描述

索引操作

Numpy当中我们已经讲过使用索引选取序列和切片选择,pandas也支持类似的操作,也可以直接使用列名、行名 称,甚至组合使用。

直接使用行列索引(先列后行)

获取'2018-02-27'这天的'close'的结果

data["open"]["2018-02-27"]  # 直接索引,必须是先列后行

在这里插入图片描述

结合loc或者iloc使用索引

获取从'2018-02-27':'2018-02-22','open'的结果
在这里插入图片描述

使用ix组合索引

Warning:Starting in 0.20.0, the .ix indexer is deprecated, in favor of the more strict .iloc and .loc indexers.

获取行第1天到第4天,[‘open’, ‘close’, ‘high’, ‘low’]这个四个指标的结果

在这里插入图片描述

赋值操作

DataFrame当中的close列进行重新赋值为1

# 直接修改原来的值 
data['close'] = 1 
# 或者 
data.close = 1

排序

排序有两种形式,一种对于索引进行排序,一种对于内容进行排序

DataFrame排序

  • 使用df.sort_values(by=, ascending=)
    • 单个键或者多个键进行排序
    • 参数
      • by:指定排序参考的键
      • ascending:默认升序
      • ascending=False:降序
      • ascending=True:升序
# 按照开盘价大小进行排序 , 使用ascending指定按照大小排序 
data.sort_values(by="open", ascending=True).head()

在这里插入图片描述

# 按照多个键进行排序 
data.sort_values(by=['open', 'high'])

在这里插入图片描述

  • 使用df.sort_index给索引进行排序
    这个股票的日期索引原来是从大到小,现在重新排序,从小到大
# 对索引进行排序 
data.sort_index()

在这里插入图片描述

Series排序

  • 使用series.sort_values(ascending=True)进行排序
    series排序时,只有一列,不需要参数
    在这里插入图片描述
  • 使用series.sort_index()进行排序
    与df一致
    在这里插入图片描述

DataFrame运算

算术运算

  • add(other)
    比如进行数学运算加上具体的一个数字

在这里插入图片描述

  • sub(other)

逻辑运算

逻辑运算符号

  • 例如筛选data["open"] > 23的日期数据
    • data["open"] > 23返回逻辑结果

在这里插入图片描述

# 逻辑判断的结果可以作为筛选的依据 
data[data["open"] > 23].head()

在这里插入图片描述

  • 完成多个逻辑判断
data[(data["open"] > 23) & (data["open"] < 24)].head()

在这里插入图片描述

逻辑运算函数

query(expr)

  • query(expr)
    • expr:查询字符串

通过query使得刚才的过程更加方便简单

data.query("open<24 & open>23").head()

isin(values)

例如判断'open'是否为23.53和23.85

# 可以指定值进行一个判断,从而进行筛选操作 
data[data["open"].isin([23.53, 23.85])]

在这里插入图片描述

统计运算

describe

综合分析: 能够直接得出很多统计结果, count , mean , std , min , max

# 计算平均值、标准差、最大值、最小值 
data.describe()

在这里插入图片描述

统计函数

Numpy当中已经详细介绍,在这里我们演示min(最小值), max(最大值), mean(平均值), median(中位数), var(方差), std(标准差),mode(众数)结果:

在这里插入图片描述
对于单个函数去进行统计的时候,坐标轴还是按照默认列“columns” (axis=0, default),如果要对行“index” 需要指定(axis=1)

  • max()、min()

在这里插入图片描述

  • std()、var()

在这里插入图片描述

  • median():中位数

中位数为将数据从小到大排列,在最中间的那个数为中位数。如果没有中间数,取中间两个数的平均值。

在这里插入图片描述

  • idxmax()、idxmin()

在这里插入图片描述

累计统计函数

在这里插入图片描述

在这里插入图片描述
以上这些函数可以对seriesdataframe操作

这里我们按照时间的从前往后来进行累计

  • 排序
# 排序之后,进行累计求和 
data = data.sort_index()
  • p_change进行求和

在这里插入图片描述
那么如何让这个连续求和的结果更好的显示呢?

在这里插入图片描述
如果要使用plot函数,需要导入matplotlib.

import matplotlib.pyplot as plt 
# plot显示图形 
stock_rise.cumsum().plot() 
# 需要调用show,才能显示出结果 
plt.show()

关于plot,稍后会介绍API的选择

自定义运算(apply)

  • apply(func, axis=0)
    • func:自定义函数
    • axis=0:默认是列,axis=1为行进行运算
  • 定义一个对列,最大值-最小值的函数
data[['open', 'close']].apply(lambda x: x.max() - x.min(), axis=0)

在这里插入图片描述

Pandas画图

pandas.DataFrame.plot

  • DataFrame.plot (kind='line')
  • kind : str,需要绘制图形的种类
    • ‘line’ : line plot (default)
    • ‘bar’ : vertical bar plot
    • ‘barh’ : horizontal bar plot
      • 关于“barh”的解释:
      • http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.plot.barh.html ‘hist’ : hist
    • ‘hist’ : histogram
    • ‘pie’ : pie plot
    • ‘scatter’ : scatter plot

更多细节:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.plot.html? highlight=plot#pandas.DataFrame.plot

pandas.Series.plot

更多细节:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.plot.html?highlight=plot#pandas.Series.plot

文件读取与存储

请参考Pandas 导入excel、csv、txt 文件数据

我们的数据大部分存在于文件当中,所以pandas会支持复杂的IO操作,pandas的API支持众多的文件格式,如CSV、SQL、XLS、JSON、 HDF5

注:最常用的HDF5和CSV文件

在这里插入图片描述

CSV

read_csv

  • pandas.read_csv(filepath_or_buffer, sep =',', usecols )
    • filepath_or_buffer:文件路径
    • sep :分隔符,默认用","隔开
    • usecols:指定读取的列名,列表形式
  • 举例:读取之前的股票的数据

在这里插入图片描述

to_csv

  • DataFrame.to_csv(path_or_buf=None, sep=', ’, columns=None, header=True, index=True, mode='w', encoding=None)

    • path_or_buf :文件路径
    • sep :分隔符,默认用","隔开
    • columns :选择需要的列索引
    • header :boolean or list of string, default True,是否写进列索引值
    • index:是否写进行索引
    • mode:‘w’:重写, ‘a’ 追加
  • 举例:保存读取出来的股票数据

    • 保存’open’列的数据,然后读取查看结果
# 选取10行数据保存,便于观察数据 
data[:10].to_csv("./data/test.csv", columns=['open'])

在这里插入图片描述
会发现将索引存入到文件当中,变成单独的一列数据。如果需要删除,可以指定index参数,删除原来的文件,重新保存一次。

# index:存储不会将索引值变成一列数据 
data[:10].to_csv("./data/test.csv", columns=['open'], index=False)

HDF5

read_hdf与to_hdf

HDF5文件的读取和存储需要指定一个键,值为要存储的DataFrame

  • pandas.read_hdf(path_or_buf,key =None,** kwargs)
  • 从h5文件当中读取数据
    • path_or_buffer:文件路径
    • key:读取的键
    • return:Theselected object
  • DataFrame.to_hdf(path_or_buf, key, \\kwargs)

案例

  • 读取文件
day_close = pd.read_hdf("./data/day_close.h5")

如果读取的时候出现以下错误

在这里插入图片描述
需要安装安装tables模块避免不能读取HDF5文件

pip install tables

在这里插入图片描述

  • 存储文件
day_close.to_hdf("./data/test.h5", key="day_close")

再次读取的时候, 需要指定键的名字

new_close = pd.read_hdf("./data/test.h5", key="day_close")

注意:优先选择使用HDF5文件存储

  • HDF5在存储的时候支持压缩,使用的方式是blosc,这个是速度最快的也是pandas默认支持的
  • 使用压缩可以提磁盘利用率,
  • 节省空间 HDF5还是跨平台的,可以轻松迁移到hadoop 上面

JSON

JSON是我们常用的一种数据交换格式,前面在前后端的交互经常用到,也会在存储的时候选择这种格式。所以我们需要知道Pandas如何进行读取和存储JSON格式。

read_json

  • pandas.read_json(path_or_buf=None, orient=None, typ='frame', lines=False)
  • JSON格式准换成默认的Pandas DataFrame格式
  • orient : string,Indication of expected JSON string format.
    • split’ : dict like {index -> [index], columns -> [columns], data -> [values]}
      • split 将索引总结到索引,列名到列名,数据到数据。将三部分都分开了
    • records’ : list like [{column -> value}, … , {column -> value}]
      • records 以 columns:values 的形式输出
    • index’ : dict like {index -> {column -> value}}
      • index 以 index:{columns:values}… 的形式输出
    • columns’ : dict like {column -> {index -> value}},默认该格式
      • colums 以 columns:{index:values} 的形式输出
  • values’ : just the values array
    • values 直接输出值
  • lines : boolean, default False
    • 按照每行读取json对象
  • typ : default ‘frame’, 指定转换成的对象类型series或者dataframe

read_josn 案例

数据介绍

这里使用一个新闻标题讽刺数据集,格式为json。 is_sarcastic :1讽刺的,否则为0; headline :新闻报道的标题; article_link :链接到原始 新闻文章。存储格式为:

在这里插入图片描述
读取

orient指定存储的json格式,lines指定按照行去变成一个样本

json_read = pd.read_json("./data/Sarcasm_Headlines_Dataset.json", orient="records", lines=True)

结果为:

在这里插入图片描述

to_json

  • DataFrame.to_json(path_or_buf=None, orient=None, lines=False)
    • 将Pandas 对象存储为json格式
    • path_or_buf=None:文件地址
    • orient:存储的json形式,{‘split’,’records’,’index’,’columns’,’values’}
    • lines:一个对象存储为一行

案例

存储文件

json_read.to_json("./data/test.json", orient='records')

结果

在这里插入图片描述
修改lines参数为True

json_read.to_json("./data/test.json", orient='records', lines=True)

结果

在这里插入图片描述

高级处理-缺失值处理

在这里插入图片描述

如何处理nan

在这里插入图片描述

电影数据的缺失值处理

在这里插入图片描述
判断缺失值是否存在

pd.notnull(movie)

在这里插入图片描述

np.all(pd.notnull(movie))

pd.isnull()

存在缺失值nan,并且是np.nan

在这里插入图片描述
1、删除

pandas删除缺失值,使用dropna的前提是,缺失值的类型必须是np.nan

# 不修改原数据 
movie.dropna() 
# 可以定义新的变量接受或者用原来的变量名 
data = movie.dropna()

2、替换缺失值

# 替换存在缺失值的样本的两列 
# 替换填充平均值,中位数 
# movie['Revenue (Millions)'].fillna(movie['Revenue (Millions)'].mean(), inplace=True)

替换所有缺失值:

for i in movie.columns: 
	if np.以上是关于Pandas二次学习- 回炉重造(进阶)的主要内容,如果未能解决你的问题,请参考以下文章

爬虫进阶爬虫概述基础篇(回炉重造)

JavaScript回炉重造

JavaScript回炉重造

机器学习线性回归(回炉重造)

回炉重造JQuery 获取和设置元素内容/属性

JavaScript回炉重造