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 = 1 n ( X i − X ˉ ) ( Y i − 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)=n−1∑i=1n(Xi−Xˉ)(Yi−Yˉ)
- 协方差>0, X和Y正相关
- 协方差<0, X和Y负相关
- 协方差=0, X和Y独立无关
Pearson相关系数
r = ∑ i = 1 n ( x i − x ˉ ) ( y i − y ˉ ) ∑ i = 1 n ( x i − x ˉ ) 2 ∑ i = 1 n ( y i − y ˉ ) 2 r=\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(xi−xˉ)2∑i=1n(yi−yˉ)2∑i=1n(xi−xˉ)(yi−yˉ)
• 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)