Python数据分析之Pandas

1 Pandas介绍

1-1 Pandas库入门

1-1-1 Pandas库介绍

Pandas是Python第三方库,提供高性能易用数据类型和分析工具,其更关注数据与索引之间的关系

Pandas有两个数据类型:Series, DataFrame
基于上述数据类型进行各类操作:基本操作、运算操作、特征类操作、关联类操作

1-1-2 Series类型

Series类型由一组数据及与之相关的数据索引组成

Series类型的索引可以是自动索引、也可以是自定义索引

#自动索引
import pandas as pd
a=pd.Series([1,2,3,4])
print(a)
'''
0    1
1    2
2    3
3    4
dtype: int64
'''
#自定义索引
import pandas as pd
b=pd.Series([5,4,2,1],index=['a','b','c','d'])#作为第二个参数,index可省略
print(b)

1-1-3 Series类型的创建

Series类型可以由如下类型创建:
• Python列表
• 标量值
• Python字典
• ndarray
• 其他函数

#Series类型创建
import pandas as pd
import numpy as np
#1.从标量
a=pd.Series(25,index=['a','b','c'])
print(a)
#2.从字典
b=pd.Series({'a':9,'b':10})
print(b)
c=pd.Series({'a':9,'b':10},index=['c','a','b'])#索引会自动对应
print(c)
#从ndarray创建
d=pd.Series(np.arange(5))
print(d)
d=pd.Series(np.arange(5),index=np.arange(9,4,-1))
print(d)

1-1-4 Series类型的基本操作

  • Series类型包括index和values两部分
    自动索引和自定义索引并存,但不能混用
#Series类型包括index和values两部分
import pandas as pd
b=pd.Series([9,8,7,6],['a','b','c','d'])
print(b.index)
print(b.values)
#自动索引和自定义索引并存
print(b['a'])
print(b[0])
#两套索引并存、但不能混用
print(b[['c','d']])#,0
  • Series类型的操作类似ndarray类型
# Series类型的操作类似ndarray类型
# • 索引方法相同,采用[]
# • NumPy中运算和操作可用于Series类型
# • 可以通过自定义索引的列表进行切片
# • 可以通过自动索引进行切片,如果存在自定义索引,则一同被切片

b = pd.Series([9,8,7,6],['a','b','c','d'])
print(b)
print(b[3])#单纯的值
print(b[:3])#对多个数据进行操作时,返回Series类型
  • Series类型的操作类似Python字典类型
# Series类型的操作类似Python字典类型:
# • 通过自定义索引访问
# • 保留字in操作
# • 使用.get()方法
import pandas as pd
b = pd.Series([9,8,7,6],['a','b','c','d'])
print(b['b'])
print('c' in b)#不会判断自动索引
print(b.get('f',100))#如果没有自定义索引‘f’,那么返回f
  • Series对齐操作:对应相加
#Series对齐操作
#Series + Series
import pandas as pd
a = pd.Series([1,2,3],['c','d','e'])
b = pd.Series([9,8,7,6],['a','b','c','d'])
print(a+b)#索引值相同的进行运算,不相同的则不进行运算
  • Series对象和索引都可以有一个名字,存储在属性.name中
#Series对象和索引都可以有一个名字,存储在属性.name中
import pandas as pd
b = pd.Series([9,8,7,6],['a','b','c','d'])
print(b.name)
b.name='Series对象'
b.index.name='num'
print(b)
#Series对象可以随时修改并即刻生效
b['a','b']=20
print(b)

1-1-5 DataFrame类型

DataFrame类型由共用相同索引的一组列组成

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AFbK5e5R-1660571661617)(Python%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%20b9ddcc445842411b945a5302ffc7d98e/Untitled%2012.png)]

DataFrame是一个表格型的数据类型,每列值类型可以不同
DataFrame既有行索引、也有列索引
DataFrame常用于表达二维数据,但可以表达多维数据

1-1-6 DataFrame类型的创建

DataFrame类型可以由如下类型创建:
• 二维ndarray对象
• 由一维ndarray、列表、字典、元组或Series构成的字典
• Series类型
• 其他的DataFrame类型

#DataFrame类型创建
import pandas as pd
import numpy as np
# • 二维ndarray对象
a=pd.DataFrame(np.arange(10).reshape(2,5))
print(a)
# • 由一维ndarray、列表、字典、元组或Series构成的字典
dt={'a':pd.Series([1,2,3],index=['a','b','c']),
   'b':pd.Series([9,8,7,6],index=['a','b','c','d'])}#键对应列索引,分配到索引对应行索引
b=pd.DataFrame(dt)
print(b)  
c=pd.DataFrame(dt,index=['d','b','c'],columns=['a','b'])#手动设置行索引,缺少的类型会被自动补齐
print(c)
dt2={'one':[1,2,3,4],'two':[5,6,7,8]}
d=pd.DataFrame(dt2,index=['a','b','c','d'])
print(d)

可与Series进行转换

#导入城市数据
import pandas as pd
dt={'城市':['北京','上海','深圳','广州','杭州'],
'环比':['101','102','103','104','105'],
'同比':['10','20','30','40','50'],  
'定基':['101','102','103','104','105']}
a=pd.DataFrame(dt,index=['c1','c2','c3','c4','c5'])  
print(a)
print(a.index)
print(a.columns)
print(a.values)
print(a['同比'])#输出列
print(a['同比']['c2'])
print(a.loc['c2'])#输出行,新生成一个series对象

1-1-7 DataFrame类型的基本操作

  • 增加或重排:重新索引

.reindex(index=None, columns=None, …)的参数

参数 说明
index,columns 新的行列自定义索引
fill_value 重新索引中,用于填充缺失位置的值
method 填充方法,ffill当前值向前填充,bfill向后填充
limit 最大填充量
copy 默认True,生成新的对象,False时,新旧相等不复制
#重新索引:.reindex()能够改变或重排Series和DataFrame索引
#导入城市数据
import pandas as pd
dt={'城市':['北京','上海','深圳','广州','杭州'],
'环比':['101','102','103','104','105'],
'同比':['10','20','30','40','50'],  
'定基':['101','102','103','104','105']}
a=pd.DataFrame(dt,index=['c1','c2','c3','c4','c5'])  
print(a)
a=a.reindex(columns=['定基','城市','环比','同比'])
print(a)
#添加索引
new= a.columns.insert(4,'新增')
print(new)
b=a.reindex(columns=new,fill_value=200)#如果没有对应值,则对应填充200
print(b)
  • 索引类型的常用方法
方法 说明
.append(idx) 连接另一个Index对象,产生新的Index对象
.diff(idx) 计算差集,产生新的Index对象
.intersection(idx) 计算交集
.union(idx) 计算并集
.delete(loc) 删除loc位置处的元素
.insert(loc,e) 在loc位置增加一个元素e
#Series和DataFrame的索引是Index类型
#Index对象是不可修改类型
import pandas as pd
dt={'城市':['北京','上海','深圳','广州','杭州'],
'环比':['101','102','103','104','105'],
'同比':['10','20','30','40','50'],  
'定基':['101','102','103','104','105']}
a=pd.DataFrame(dt,index=['c1','c2','c3','c4','c5'])  
print(a)

#以下是正式操作
nc=a.columns.delete(2)
print(nc)
ni=a.index.insert(5,'c0')
print(ni)
nd=a.reindex(index=ni,columns=nc).ffill()#向前填充
print(nd)
#.drop()能够删除Series和DataFrame指定行或列索引

print(nd.drop('环比',axis=1))#删除列要加上axis
print(nd.drop('c0'))#删除行
  • 数据类型运算

算术运算根据行列索引,补齐后运算,运算默认产生浮点数
补齐时缺项填充NaN (空值)
二维和一维、一维和零维间为广播运算(!)
采用+ ‐ * /符号进行的二元运算产生新的对象

import pandas as pd
import numpy as np
a=pd.DataFrame(np.arange(12).reshape(3,4))
b=pd.DataFrame(np.arange(20).reshape(4,5))
print(a)
print(b)
print(a+b)#先补齐后运算

方法形式的运算

方法 说明
.add(d,**argws) 类型间加法运算,可选参数
.sub(d,**argws) 类型间减法运算,可选参数
.mul(d,**argws) 类型间乘法运算,可选参数
.div(d,**argws) 类型间除法运算,可选参数
import numpy as np
a=pd.DataFrame(np.arange(12).reshape(3,4))
b=pd.DataFrame(np.arange(20).reshape(4,5))
print(a)
print(b)
print(b.add(a,fill_value=100))#先补齐,空缺位置填充100,后运算
import pandas as pd
import numpy as np
a=pd.DataFrame(np.arange(12).reshape(3,4))
b=pd.Series(np.arange(5))
print(a)
print(b)
print(a-b)
print(a.sub(b,axis=0))#0轴参与运算
# 比较运算只能比较相同索引的元素,不进行补齐
# 二维和一维、一维和零维间为广播运算
# 采用> < >= <= == !=等符号进行的二元运算产生布尔对象
import pandas as pd
import numpy as np
a=pd.DataFrame(np.arange(12).reshape(3,4))
b=pd.DataFrame(np.arange(12,0,-1).reshape(3,4))
print(a)
print(b)
print(a>b)
import pandas as pd
import numpy as np
a=pd.DataFrame(np.arange(12).reshape(3,4))#默认在一轴
b=pd.Series(np.arange(4))
print(a)
print(b)
print(a>b)

1-2 Pandas数据特征分析

1-2-1 数据的排序

.sort_index()方法在指定轴上根据索引进行排序,默认升序

.sort_values()方法在指定轴上根据数值进行排序,默认升序

by : axis轴上的某个索引或索引列表

#1.操作索引
# .sort_index()方法在指定轴上根据索引进行排序,默认升序
# .sort_index(axis=0, ascending=True)默认纵向升序排序
import pandas as pd
import numpy as np
a=pd.DataFrame(np.arange(20).reshape(4,5),index=['a','c','d','b'])
print(a)
print(a.sort_index())
print(a.sort_index(axis=1, ascending=False))
#2.按照数值
# .sort_values()方法在指定轴上根据数值进行排序,默认升序
# Series.sort_values(axis=0, ascending=True)
# DataFrame.sort_values(by, axis=0, ascending=True)
# by : axis轴上的某个索引或索引列表
#NaN统一放到排序末尾
import pandas as pd
import numpy as np
a=pd.DataFrame(np.arange(20).reshape(4,5),index=['a','c','d','b'])
print(a)
print(a.sort_values(2,ascending=False))
print(a.sort_values('c',axis=1,ascending=False))
print(a)

1-2-2 数据的统计分析函数

基本的统计分析函数

方法 说明
.sum() 计算数据的总和,按0轴计算,下同
.count() 非NaN值的数量
.mean() .median() 计算数据的算术平均值、算术中位数
.var() .std() 计算数据的方差、标准差
.min().max() 计算数据的最小值、最大值
.argmin() .argmax() 计算数据最大值、最小值所在位置的索引位置(自动索引)
.idxmin() .idxmax() 计算数据最大值、最小值所在位置的索引(自定义索引)
.describe() 针对0轴(各列)的统计汇总
import pandas as pd
import numpy as np
a=pd.Series([9,8,7,6],index=['a','b','c','d'])
b=pd.DataFrame(np.arange(20).reshape(4,5),index=['a','c','d','b'])
print(a)
print(a.describe())
print(a.describe()['count'])
print('\n\n\n',b)
print(b.describe())
print(b.describe()[2])
print(b.describe().loc['max'])

1-2-3 数据的累计统计分析函数

累计统计分析函数

方法 说明
.cumsum() 依次给出前1、2、…、n个数的和
.cumprod() 依次给出前1、2、…、n个数的积
.cummax() 依次给出前1、2、…、n个数的最大值
.cummin() 依次给出前1、2、…、n个数的最小值
import pandas as pd
import numpy as np
b=pd.DataFrame(np.arange(20).reshape(4,5),index=['a','c','d','b'])
print(b.cumsum())
print(b.cumprod())
print(b.cummax())
print(b.cummin())
方法 说明
.rolling(w).sum() 依次计算相邻w个元素的和
.rolling(w).mean() 依次计算相邻w个元素的算术平均值
.rolling(w).var() 依次计算相邻w个元素的方差
.rolling(w).std() 依次计算相邻w个元素的标准差
.rolling(w).min() .max() 依次计算相邻w个元素的最小值和最大值
import pandas as pd
import numpy as np
b=pd.DataFrame(np.arange(20).reshape(4,5),index=['a','c','d','b'])
print(b)
print(b.rolling(2).sum())#纵向两个单位求和

1-2-4 数据的相关分析

相关性粗浅描述
• X增大,Y增大,两个变量正相关
• X增大,Y减小,两个变量负相关
• X增大,Y无视,两个变量不相关

数学描述

斜方差

cov⁡(X,Y)=∑i=1n(Xi−Xˉ)(Yi−Yˉ)n−1\operatorname{cov}(X, Y)=\frac{\sum_{i=1}^{n}\left(X_{i}-\bar{X}\right)\left(Y_{i}-\bar{Y}\right)}{n-1}cov(X,Y)=n1i=1n(XiXˉ)(YiYˉ)

  • 协方差>0, X和Y正相关
  • 协方差<0, X和Y负相关
  • 协方差=0, X和Y独立无关

Pearson相关系数

r=∑i=1n(xi−xˉ)(yi−yˉ)∑i=1n(xi−xˉ)2∑i=1n(yi−yˉ)2r=\frac{\sum_{i=1}^{n}\left(x_{i}-\bar{x}\right)\left(y_{i}-\bar{y}\right)}{\sqrt{\sum_{i=1}^{n}\left(x_{i}-\bar{x}\right)^{2}} \sqrt{\sum_{i=1}^{n}\left(y_{i}-\bar{y}\right)^{2}}}r=i=1n(xixˉ)2 i=1n(yiyˉ)2 i=1n(xixˉ)(yiyˉ)

• 0.8‐1.0 极强相关
• 0.6‐0.8 强相关
• 0.4‐0.6 中等程度相关
• 0.2‐0.4 弱相关
• 0.0‐0.2 极弱相关或无相关

相关分析函数

方法 说明
.cov() 计算协方差矩阵
.corr() 计算相关系数矩阵,Pearson、Spearman、Kendall等系数
import pandas as pd
import matplotlib.pyplot as plt
hprice=pd.Series([3.04,22.93,12.75,22.6,12.33],index=['2008','2009','2010','2011','2012'])#房价增长
m2=pd.Series([8.18,18.38,9.13,7.82,6.69],index=['2008','2009','2010','2011','2012'])
plt.plot(hprice.index,hprice.values,'r')
plt.plot(m2.index,m2.values,'y')
hprice.cov(m2)
hprice.corr(m2)

在这里插入图片描述

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐