Pandas
pannel面板数据 + data + analysis
也就是一个数据处理工具
- 基础处理
- Pandas是什么,为什么用
- 便捷的数据处理能力
- 读取文件方便
- 封装了Matplotlib、NumPy的画图和计算
- 核心数据结构
- DataFrame、Pannel、Series
- 基本操作
- 索引操作
- 赋值操作
- 排序
- 运算
- 画图
- 文件的读取与存储
- Pandas是什么,为什么用
- 高级处理
- 处理缺失值
- 数据离散化
- 合并
- 交叉表与透视表
- 分组与聚合
基础处理
🐱Pandas核心数据结构
一🐈.DataFrame(二维)
Series的容器
结构(创建)
既有行索引,又有列索引的二维数组(让数据更有意义的显示)
import pandas as pd
数组名=pd.DataFrame(数组名)
- 行索引 index
- 列索引 columns
import numpy as np
import pandas as pd
#创建这个数据
stock_change=np.random.normal(0,1,(10,5))
#print(stock_change)
#原来—————————————————
#加上行列索引,但是它现在就是数字,没有意义
#stock_change=pd.DataFrame(stock_change)
#print(stock_change)
#————————————————————
#创建行索引
stock=["股票{}".format(i) for i in range(10)]
#创建列索引
date=pd.date_range(start='20230101',periods=5,freq='B')
#添加进去
stock_change=pd.DataFrame(stock_change,index=stock,columns=date)
print(stock_change)
这样就会得到:
属性
- shape
- index
- columns
- values(直接获取其中array的值)
- T(转置)
方法
- head
- tail
返回的是前几行,或后几行
修改行列索引值的注意事项:
- 修改行列索引值
- 修改行或列的索引值就必须整体修改,不能单独修改某行或者某列
- 重设索引
- reset_index(drop=False)
- 设置新的下标索引
- drop:默认为False,不删除原来索引,如果为True就是删除原来的索引值
- 设置索引
- 区别于上面设置行列的方法,还可以用字典来创建dataframe
-
- set_index(keys,drop=True)
- keys:列索引名称或列索引名称列表
- drop:boolean,default,True当作新的索引,删除原来的列
- 通过这样的设置,dataframe就变成了一个具有MultiIndex的dataframe
二🐈.MultiIndex(三维)
多级或分层索引对象
- index属性
- names:levels的名称
- levels:每个level的元组值
直接打点访问即可
二🐈.Pannel(三维)
存储 三维 数组的面板结构的,dataframe的 容器 pd.Pannel()
三🐈.Series(一维)
- 带索引的一维数组
- series结构只有行索引
创建
pd.Series()
属性
- index
- values
🐱基本数据操作
索引操作
- 直接索引
- dataframe不支持直接这样数字索引
数组[行,列]
- 正确的应该是先列后行,
数组["列"]["行"]
- dataframe不支持直接这样数字索引
- 按名字索引
数组名.loc["行"]["列"]
,先行后列数组名.loc["行","列"]
- 按数字索引
数组名.iloc[行,列]
- 组合索引
- 可以数字和名字混用
- 使用
ix
-
赋值操作
# 直接修改原来的值
data['close']=1
#或者
data.close=1
排序
两种形式,可对dataframe或者series排序
对DataFrame
- 对内容进行排序(列)
名.sort_values(key=,ascending=)
- key 就是指按哪一列排序,(也可以传个列表,按多键进行排序)
- ascending=True 升序,False 降序
- 对索引进行排序(行)
名.sort_index()
,从小到大
对Series
- 对内容进行排序
名.series.sort_values(ascending=)
- 只有一列,所以不需要参数
- 对索引进行排序
名.series.sort_index()
,从小到大
🐱DataFrame运算
算术运算
- 加
数组名["列名"].add(数字)
,add这个后面可以打点head,而下面这个是不可以的数组名["列名"]+数字
- sub()减
- 也可以直接对数组名运算,作用对象就是每个数据
逻辑运算
- 运算符:<、>、|、&
- 逻辑运算函数
数组名.query(“expr”)
,expr:查询字符串数组名.isin(values)
,判断一组数据中是否有某些值
统计运算
data数组名.describe()
,得到的是值- describe可以直接得到所有统计结果count、mean、std、var、min、max、median
- 如果只需要其中一个的话,
单独打点(axis=0按列/按1行)
就可以,默认=0按列
- 如果获取最值的位置的话用
数组名.idxmax()
,数组名.idxmin()
,axis默认为0,即按列 - 累计统计函数
- cumsum,计算前n个数之和
- cummax,计算前n个数最大值
- cummin,计算前n个数最小值
- cumprod,计算前n个数的乘积
自定义运算
apply(func,axis=0)
,func为自定义函数
🐱Pandas画图
- DataFrame画图
DataFrame.plot(x=None,y=None,kind=’line‘)
- x,y轴
- line plot折线图、bar树状图、hist直方图、pie饼图、scatter散点图
- stacked是否堆叠,填布尔值
- Series画图
.plot()
,可以画折线图,记得需要导入
import matplotlib.pyplot as plt
🐱csv(文本)文件的读取与存储
🐱HDF5(二进制)文件的读取与存储
HDF5可以存储三维数据的文件
🐱JSON(文本)文件的读取与存储
高级处理
缺失值处理
这是之前NumPy里出现过的问题,用pandas解决更为便捷,直接.mean()就可以求得
如何处理nan
- 1.判断数据中是否存在缺失值
pd.isnull(df)
,有缺失值就返回truepd.notnull(df)
,有缺失值就返回false
- 2.如果缺失值是nan
- 直接删除:
df.dropna(axis='rows'inplace=True)
- 默认按行删除
- true就是原地删除,false不改变原来,而是返回一个新的df。默认是false
- 替换/插补:df.fillna(value,inplace=True)
- value就是要填补的值
- inplace
- 直接删除:
- 3.当缺失值不是nan,而是一些有默认标记的,比如说问号…
- 处理思路就是:
- 先将它转成nan形式:
df.replace(to_replace=’?‘,value=np.nan)
- 再处理nan
- 先将它转成nan形式:
- 处理思路就是:
数据离散化
是什么
而上面这种的表现形式,我们叫做one-hot编码,也叫哑变量
如何实现数据的离散化
- 对数据进行分组
- 自动分组:
sr=pd.qcut(data,bins组数)
- 自定义分组:
sr=pd.cut(data,bins)
,bins传一个列表,里面放分界值 - 对数据进行分组,一般会与value_counts搭配使用
- series.value_counts(),统计分组次数
- 对分好组的数据求哑变量
pandas.get_dummies(sr,prefix=前缀)
合并
按方向合并
pd.concat([data1,data2],axis=0竖直)
按索引合并
pd.merge(left,right,how="inner内连接",on=[索引])
inner内连接,outer外连接,left左连接,right右连接
这是内连接
交叉表和透视表
找到/探索两个变量之间的关系
交叉表:用于计算一列数据对于另外一列数据的分组个数(寻找两个列之间的关系)
pd.crosstab(value1,value2)
透视表:
df.pivot_table([],index=[])
分组与聚合
分组和聚合通常是分析数据的一种方式,通常与一些统计函数一起使用,查看数据的分组情况
分组+聚合:
key(by)表示按哪一个列分组
比如对颜色分组,对price聚合
- df方式
df.groupby(by="color")["price"].max()
- sr方式
col["price"].groupby(col["color"]).max()