我的Python分析成长之路9
pandas入门
统计分析是数据分析的重要组成部分,它几乎贯穿整个数据分析的流程。运用统计方法,将定量与定性结合,进行的研究活动叫做统计分析。而pandas是统计分析的重要库。
1.pandas数据结构
在pandas中,有两个常用的数据结构:Series和Dataframe 为大多数应用提供了一个有效、易用的基础。
1.Series:Series是一种一维的数组型对象,它包含一个值序列,并含有数据标签。
- import pandas as pd
- ser1 = pd.Series([1,2,3,4])
- print(ser1)
- print(ser1.index) #ser1的索引
- print(ser1.values) #ser1的值
- ser2= pd.Series([1,2,3,4],index=['a','b','c','d']) #自己设置索引
- print(ser2['a']) #获得索引为a的值
- print(ser2[['a','b','c']])#获取多个索引值\
- #Series对象自身和其索引都有name属性,
- ser2.name ="p"
- ser2.index.name = 'state'
- print(ser2)
2.DataFrame:表示的是矩阵的数据表,它包含已排序的列集合,每一个可以是不同的值类型(数值、字符串、布尔值)。DataFrame既有行索引又有列索引。最常用的就是利用包含等长度的列表或numpy数据的字典来形成DataFrame
- import pandas as pd
- import numpy as np
- data ={'state':['a','a','a','b','b','b'],
- "year":[2000,2001,2002,2001,2002,2003],
- "pop":[1.5,1.7,3.6,2.4,2.9,3.2]}
- df1 = pd.DataFrame(data)
- print(df1)
- df2 = pd.DataFrame(data,columns=['year','state','pop'],index=["one","two","three","four","five","six"]) #自己设置列名
- print(df2.columns)
- print(df2['year']) #获取year列值
- print(df2.year)
- print(df2.loc["one"]) #获取one行值
- df2['debt'] = np.arange(6)
- print(df2)
3.使用loc和iloc选择数据
loc方法是针对DataFrame索引名称的切片方法,如果传入的不是索引名称,那么切片操作无法执行。利用loc方法,能够实现所有单层索引切片操作。
loc使用方法:DataFrame.loc[行索引名称或条件,列索引名称,如果内部传递的是一个区间,则左闭右开。loc内部可以出入表达式,返回布尔值的series
iloc和loc的区别是,iloc接受的必须是行索引和列索引的位置。iloc方法的使用,DataFrame.ilo[行索引位置,列索引位置],传递是区间,左闭右闭
- import pandas as pd
- import numpy as np
- data ={'state':['a','a','a','b','b','b'],
- "year":[2000,2001,2002,2001,2002,2003],
- "pop":[1.5,1.7,3.6,2.4,2.9,3.2]}
- df2 = pd.DataFrame(data,columns=['year','state','pop'],
- index=["one","two","three","four","five","six"])
- print(df2['year']) #从DataFrame中选择单列或列序列
- print(df2.loc["one"]) #从DataFrame中选择单行或多行
- print(df2.loc[:,"year"]) #从DataFrame中选择单列
- print(df2.loc["one","year"]) #同时确定行和列
- print(df2.loc["one",['year','state']]) #一行两列
- print(df2.loc["condition",[]]) #loc 可以接受表达式
- print(df2.iloc[1]) #选取单行
- print(df2.iloc[:,[2,3]]) #选取索引为第2,3列
- # print(df2.ilov[where_i,where_j][condition])
- df2.iloc[condition,[]].values #iloc方法不能接受表达式,条件返回的是一个Series,取出Series的值
- import numpy as np
- import pandas as pd
- df4 = pd.DataFrame(np.arange(8).reshape(2,4),index=["three","one"],columns=["d","a","b","c"])
- print(df4.sort_index(axis=1,ascending=False)) #反序
- print(df4.sort_values(by='b')) #根据b列数值排序
- print(df4.sort_values(by=['a','b']))
- df5 = pd.Series([7,-5,7,4,2,0,4])
- print(df5.rank())
- print(df5.rank(method='first')) #按照值在数据中出现的次序分配排名
4.删除某列或某行的数据
DataFrame.drop(label,axis=0,level=None,inplace=False)
label:表示要删除的数据。axis:表示要操作的轴,inplace:表示操作是否对原数据生效
2.描述性统计分析
描述性统计是用来概括、表述事物的整体状况,以及事物间关联、类属关系的统计方法。通过几个统计值可简捷地表达地表示一组数据的集中趋势和离散程度。
1.数值型特征的描述性统计
数值型特征的描述性统计主要包括了计算数值型数据的完整情况、最小值、均值、中位数、最大值、四分位数、极差、标准差、方差、协方差和变异系数。
min:最小值
max:最大值
mean:平均值
ptp:极差
median:中位数
std:标准差
var:方差
cov:协方差
corr:相关性
mod:众数
skew:样本偏度
kurt:样本峰度
quantile:四分位数
count:非空值数目
mad:平均绝对离差
describe:计算Series或DataFrame各列的汇总统计集合
pct_change:计算百分比
2.类别型数据的描述性统计
描述类别型特征的分布状况,可以使用频数统计表
value_count:返回一个Series,索引是唯一值序列,值是计数个数,按照个数降序排序
- 1 import pandas_datareader.data as web
- 2 tickers =['AAPL',"IBM","GOOG"]
- 3 all_data = {ticker:web.get_data_yahoo(ticker) for ticker in tickers}
- 4 price = pd.DataFrame({ticker:data['Adj Close'] for ticker,data in all_data.items()})
- 5 volums = pd.DataFrame({ticker:data['Volume'] for ticker,data in all_data.items()})
- 6 returns = price.pct_change()
- 7 print(returns.tail())
- 8 print(returns['AAPL'].corr(returns['IBM']))
- 9 print(returns.corr()) #计算相关性
- 10 print(returns.cov()) #计算协整性
- 11 print(returns.corrwith(volums))
3.数据分析中的分组聚合、转化操作
1.使用groupby方法分组
DataFrame.groupby(by=None,axis=0,level=None,as_index=True,sort=True,group_by=True,squeeze=False,**ksargs)
- import pandas as pd
- df = pd.DataFrame({'key1':["a","a","b","b","a"],
- "key2":["one","two","one","two","one"],
- "data1":np.random.randn(5),
- "data2":np.random.randn(5)})
- print(df)
- # group = df['data1'].groupby(df['key1']) #对data1列进行分组,获得一个group对象
- # group= df.groupby(df['key1'])['data1'] #两个等价
- group = df.groupby(df['key1']) #对整个DataFrame分组
- print(group.count()) #返回分组的数目
- print(group.head()) #返回每组的前几个值
- print(group.max()) #返回每组的最大值
- print(group.mean()) #返回每组的均值
- print(group.median()) #返回每组的中位数
- print(group.cumcount()) #对每个分组中的成员进行标记
- print(group.size()) #返回每个分组的大小
- print(group.min()) #返回每个分组的最小值
- print(group.std()) #返回每组的标准差
- print(group.sum()) #返回每组的和
- group2 = df['data1'].groupby([df['key1'],df['key2']]) #根据key1,key2分组
2.使用agg和aggregate方法聚合,能够将函数应用于每一列
DataFrame.agg(func,axis=0,*args,**kwargs)
DataFrame.aggregate(func,axis=0,*args,**kwargs)
- import pandas as pd
- df = pd.DataFrame({'key1':["a","a","b","b","a"],
- "key2":["one","two","one","two","one"],
- "data1":np.random.randn(5),
- "data2":np.random.randn(5)})
- group = df['data1'].groupby(df['key1']) #对data1列进行分组,获得一个group对象
- group= df.groupby(df['key1'])['data1'] #两个等价
- group = df.groupby(df['key1']) #对整个DataFrame分组
- print(group.count()) #返回分组的数目
- print(group.head()) #返回每组的前几个值
- print(group.max()) #返回每组的最大值
- print(group.mean()) #返回每组的均值
- print(group.median()) #返回每组的中位数
- print(group.cumcount()) #对每个分组中的成员进行标记
- print(group.size()) #返回每个分组的大小
- print(group.min()) #返回每个分组的最小值
- print(group.std()) #返回每组的标准差
- print(group.sum()) #返回每组的和
- print(group.quantile(0.9)) #返回每组的分位数
- group2 = df['data1'].groupby([df['key1'],df['key2']]) #根据key1,key2分组
- print(group.agg(np.mean)) #返回均值
- def f(x):
- return x.max()-x.min()
- print(group.agg(f)) #使用自定义函数
- group3 = df.groupby(df["key1"])
- print(group3.agg({"data1":np.mean,"data2":np.max})) #对data1 和 data2分别操作
3.使用apply方法聚合,apply方法类似于agg方法,能够将函数应用于每一列。不同之处在于,与agg方法相比,apply方法传入的函数只能作用于这个DataFrame或Series,而无法像agg一样能够对不同字段函数使用不同函数来获取不同结果。
DataFrame.apply(func,axis=0,broadcast=False,raw=False,reduce=None,args=(),**kwds)
- import pandas as pd
- df = pd.DataFrame({'key1':["a","a","b","b","a"],
- "key2":["one","two","one","two","one"],
- "data1":np.random.randn(5),
- "data2":np.random.randn(5)})
- group = df['data1'].groupby(df['key1']) #对data1列进行分组,获得一个group对象
- # group= df.groupby(df['key1'])['data1'] #两个等价
- group = df.groupby(df['key1']) #对整个DataFrame分组
- print(group.count()) #返回分组的数目
- print(group.head()) #返回每组的前几个值
- print(group.max()) #返回每组的最大值
- print(group.mean()) #返回每组的均值
- print(group.median()) #返回每组的中位数
- print(group.cumcount()) #对每个分组中的成员进行标记
- print(group.size()) #返回每个分组的大小
- print(group.min()) #返回每个分组的最小值
- print(group.std()) #返回每组的标准差
- print(group.sum()) #返回每组的和
- print(group.quantile(0.9)) #返回每组的分位数
- group2 = df['data1'].groupby([df['key1'],df['key2']]) #根据key1,key2分组
- print(group.agg(np.mean)) #返回均值
- def f(x):
- return x.max()-x.min()
- print(group.agg(f)) #使用自定义函数
- group3 = df.groupby(df["key1"])
- print(group3.agg({"data1":np.mean,"data2":np.max})) #对data1 和 data2分别操作
- print(group3[["data1","data2"]].apply(lambda x:(x.mean()-x.min())/(x.max()-x.min())))#使用自定义函数
4.使用transform方法聚合
transform方法能够对整个DataFrame的所有元素进行操作,transform只有一个函数"func
4.创建透视表和交叉表
1.使用pivot_table函数制作透视表
pandas.pivot_table(data,values=None,index=None,columns=None,aggfunc="mean",fill_value=None,margins=False,dropna=True,margins_name="all")
index:表示行分组键,clolums:表示列分组键 func:聚合函数 fill_value :对缺失值进行填充
- l = pd.pivot_table(df[["key1",'data1',"data2"]],index="key1")
- print(l)
2.使用crosstab函数创建交叉表
pandas.crosstab(index,columns,values=None,rownames=None,colnames=None,aggfunc=None,margins=False,dropna=True,normalise=False)
index:行索引键 columns:列索引键,value:聚合数据 rownames:行分组键,colnames:列分组键 aggfunc:聚合函数
- l2 = pd.crosstab(index=df["key1"],columns=df["key2"],values=df["data1"],aggfunc=np.sum)
- print(l2)
我的Python分析成长之路9的更多相关文章
- 我的Python分析成长之路7
类 一.编程范式: 1.函数式编程 def 2.面向过程编程 (Procedural Programming) 基本设计思路就是程序一开始是要着手解决一个大的问题,然后把一个大问题分解成很多个 ...
- 我的Python分析成长之路6
模块:本质就是.py结尾的文件.从逻辑上组织python代码. 包: 本质就是一个目录,带有__init__.py文件,从逻辑上组织模块. 模块的分类: 1.标准库(内置的模块) 2.开源库(第三方库 ...
- 我的Python分析成长之路10
matplot数据可视化基础 制作提供信息的可视化(有时称作绘图)是数据分析中最重要任务之一. 1.图片(画布)与子图 plt.figure :创建一张空白的图片,可以指定图片的大小.像素. figu ...
- 我的Python分析成长之路8
Numpy数值计算基础 Numpy:是Numerical Python的简称,它是目前Python数值计算中最为基础的工具包,Numpy是用于数值科学计算的基础模块,不但能够完成科学计算的任而且能够用 ...
- 我的Python分析成长之路11
数据预处理 如何对数据进行预处理,提高数据质量,是数据分析中重要的问题. 1.数据合并 堆叠合并数据,堆叠就是简单地把两个表拼在一起,也被称为轴向链接,绑定或连接.依照轴的方向,数据堆叠可分为横向堆叠 ...
- 我的Python分析成长之路2
2018-12-29 一.python数据类型: 1.数字 int(整形) float(浮点型) complex(复数型) 2.布尔值(bool) 真或假 True or False 3.字符 ...
- 我的Python分析成长之路1
Python是什么? ...
- 我的Python分析成长之路5
一.装饰器: 本质是函数,装饰其他函数,为其他函数添加附加功能. 原则: 1.不能修改被装饰函数的源代码. 2.不能修改被装饰函数的调用方式. 装饰器用到的知识: 1.函数即变量 (把函数体赋值给 ...
- 我的Python分析成长之路4
一.函数 1.什么是函数?:函数是带名字的代码块,调用函数,只要调用函数名就可以. 2.函数的性质:1.减少重复代码 2.使程序变得可扩展 3.使程序变得易维护 3.编程范示: 1.面向对象编程 ...
随机推荐
- JS 两个数组合并
让我们先考虑下面这情况: 代码如下: var a = [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ];var b = [ "foo", "bar", ...
- UVa12304(计算几何中圆的基本操作)
断断续续写了250多行的模拟,其间被其他事情打扰,总共花了一天才AC吧~ 这道题目再次让我明白,有些事情看起来很难,实际上并没有我们想象中的那么难.当然了我主要指的不是这个题的难度…… 也是初学计算几 ...
- freertos之队列
任务间信息的传递是通过队列来实现的(单个值.结构体.共享数据指针.),队列是个独立的内核对象,即不属于任何一个任务,每个任务都可以向队列中发送数据和从队列中读数据.对于数据量小的场合通常队列是通过字节 ...
- axios 在vue中使用
下载组件: npm install axios --save npm install qs --save //处理对象防止产生跨域问题 引入: 新建axios文件夹,文件下新建index.js文件 i ...
- [android][windows][使用HAXM加速模拟器][不使用SDK manager]
网上找到了来使用HAXM,可惜我在sdk manager上下载不了,也使用过勾上[fetching...]那个选项,依然无效. 所以自己手动下载来安装和使用. 具体的教程可以参考http://blog ...
- Coder(线段树)
求一部分和的线段树,因为是对5取余,所以给定一段区间a-b,假设其位置会有变化,最多会有5种和,那么就可以保留这五种和,在用lz进行延迟标记时,保存位置变化了多少也就知道了该从当前和转到哪一个和. 当 ...
- JS中数组的介绍
一.数组: 一组数据的集合: 二.JS中数组的特点: 1.数组定义时无需指定数据类型: 2.数组定义时可以无需指定数组长度: 3.数组可以存储任何类型的数据: 4.一般是相同的数据类型: 三.数组的创 ...
- Android Generate Signed APK: Errors while building APK. You can find the errors )
开发过程中,总会遇到很多坑: Gradle build finished with 101 error(s) in 1m 35s 424ms 19:23:50 Generate Signed APK: ...
- Apache Kafka框架学习
背景介绍 消息队列的比较 kafka框架介绍 术语解释 文件存储 可靠性保证 高吞吐量实现 负载均衡 应用场景 背景介绍: kafka是由Apache软件基金会维护的一个开源流处理平台,由scala和 ...
- show processlist使用介绍
这个命令中最关键的就是state列,mysql列出的状态主要有以下几种: Checking table 正在检查数据表(这是自动的).Closing tables 正在将表中修改的数据刷新到磁盘中,同 ...