Python数据分析之Pandas

本文介绍了Pandas库在Python数据分析中的关键作用,包括Series和DataFrame的基础概念、创建方法、索引操作、数据排序、统计分析、相关性计算以及DataFrame的高级操作。通过实例演示了如何使用Pandas进行数据清洗、排序、聚合和可视化,适合初学者快速上手。
摘要由CSDN通过智能技术生成

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)=n1i=1n(XiXˉ)(YiYˉ)

  • 协方差>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(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)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值