前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >统计师的Python日记【第5天:Pandas,露两手】

统计师的Python日记【第5天:Pandas,露两手】

作者头像
数说君
发布2018-04-04 16:20:52
3K0
发布2018-04-04 16:20:52
举报
文章被收录于专栏:数说工作室数说工作室

本文是【统计师的Python日记】第5天的日记

回顾一下:

第1天学习了Python的基本页面、操作,以及几种主要的容器类型;

第2天学习了python的函数、循环和条件、类。

第3天了解了Numpy这个工具库。

第4天初步了解了Pandas这个库

原文复习(点击查看):

第1天:谁来给我讲讲Python?

第2天:再接着介绍一下Python呗

【第3天:Numpy你好】

【第4天:欢迎光临Pandas】

【第四天的补充

今天将带来第5天的学习日记。

目录如下:

前言

一、描述性统计

1. 加总

2. 描述性统计

3. 相关系数

二、缺失值处理

1. 丢弃缺失值

2. 填充缺失值

三、层次化索引

1. 用层次索引选取子集

2. 自定义变量名

3. 变量名与索引互换

4. 数据透视表

四、数据导入导出

1. 数据导入

2. 数据导出


统计师的Python日记【第5天:Pandas,露两手】

前言

根据我的Python学习计划:

Numpy → Pandas → 掌握一些数据清洗、规整、合并等功能 → 掌握类似与SQL的聚合等数据管理功能 → 能够用Python进行统计建模、假设检验等分析技能 → 能用Python打印出100元钱 → 能用Python帮我洗衣服、做饭 → 能用Python给我生小猴子......

上一集开始学习了Pandas的数据结构(Series和DataFrame),以及DataFrame一些基本操作:改变索引名、增加一列、删除一列、排序。

今天我将继续学习Pandas。

一、描述性统计

想拿一个简单的数据试试手,翻到了一份我国2012-2015年季度GDP的数据,如下表(单位:万亿),

想整理到DataFrame中,如何处理?

用DataFrame:

gdp=DataFrame([[11.61,13.08, 13.67, 15.05],[12.81, 14.30, 15.07, 16.62], [13.87, 15.52, 16.35, 17.87], [14.80, 16.62,17.36, 18.94]], index=['2012', '2013', '2014', '2015'], columns=['s1', 's2','s3', 's4'])

得到了一张非常清爽的DataFrame数据表。

现在我要对这张表进行简单的描述性统计:

1. 加总

.sum()是将数据纵向加总(每一列加总)

这就很奇怪了,2012、2013、2014、2015四个年份的第一季度加总,这是什么鬼?其实我更想看横向加总,就是每一年四个季度加总,得到一年的总和,原来,指定axis=1即可:

特别注意的是缺失值的情况!

如果有缺失值,比如四个数值2,3,1,NaN,那么加总的结果是2+3+1+NaN=6,也就是缺失值自动排除掉了!这点特别注意,因为这可能会导致你的数据不必苛,比如某一年少一个季度的值,那么这一年其实就是三个季度的加总,跟其他年份四个季度怎么比?

因为刚入行的时候在excel上犯过这类错误,所以在此记录一下。

解决办法是指定 skipna=False,有缺失值将不可加总:

>>>df=DataFrame([[1.4, np.nan], [7.1, -4.5], [np.nan, np.nan], [0.75, -1.3]], index=['a', 'b', 'c', 'd'], columns=['one', 'two']) >>>df

这是一组有缺失值的数据,现在来加总:

还可以累积加总:

关于缺失值,在后面还要专门学习(二、缺失值)。

2. 描述性统计

pandas除了加总,还可以利用 .describe() 得到每列的各种描述性分析:

当然,除了用 .describe() 还可以自己用函数来得到,比如:

一些函数记录在此(参考书本《利用Python进行数据分析》):

方法

描述

count()

非NA值的数量

describe()

各列的汇总统计

min()、max()

最小、最大值

argmin()、argmax()

最小、最大值对应的索引位置

idxmin()、idxmax()

最小、最大值对应的索引值

quantile()

样本分位数

sum()

加总

mean()

均值

median()

中位数

mad()

根据平均值计算的平均绝对离差

var()

方差

std()

标准差

skew()

偏度

kurt()

峰度

cumsum()

累计和

cummax()、cummin()

累计最大值和累计最小值

cumprod()

累计积

diff()

一阶差分

pct_change()

百分数变化

3. 相关系数

利用 .corr() 可以计算相关系数,比如计算四个季度的相关系数:

计算年份的相关系数呢?转置一下就可以了:

然而可惜的是——没有P值!

也可以单独只计算两列的系数,比如计算S1与S3的相关系数:

二、缺失值处理

Pandas和Numpy采用NaN来表示缺失数据,

1. 丢弃缺失值

两种方法可以丢弃缺失值,比如第四天的日记中使用的的城市人口数据:

将带有缺失的行丢弃掉:

这个逻辑是:“一行中只要有一个格缺失,这行就要丢弃。”

那如果想要一行中全部缺失才丢弃,应该怎么办?传入 how=’all‘ 即可。

Chu那行被丢弃掉了。

另一种丢弃缺失值的方法是 data[data.notnull()] ,但是只能处理 数值型 数据。

2. 填充缺失值

.fillna() 方法对缺失值进行填充,比如将缺失值全部变为0:

还可以指定填充方法:

method=

  • 'ffill' 向前填充,即将前面的内容填充进来;
  • 'bffill' 向后填充,即将后面的内容填充进来。

举个例子:

后面baoding的pop被填充进来了。

三、层次化索引

我们前面的索引就是Chu、Bao、Ha、Hu......,单一层次索引,如果索引为亚洲-中国-各个省-各个市,变量为人口,这就是典型的层次化索引。

>>> worldPop = pd.Series([13.74,13.41, 13.08, 1.27, 3.21, 3.09],index=[['China','China','China','Japan','US','US'],[2015,2010,2005,2015,2015,2010]])

这个例子中索引有两层,国家和年份,来学习一些简单的操作。

1. 用层次索引选取子集:

选取多个子集呢?

2. 自定义变量名

自定义变量名的好处很多,可以更方便的对数据进行选择。使用 columns= 自定义变量名:

索引的名字也可以当变量一样命名,分别命名country和year两个索引名:

.swaplevel() 可以调换两个索引contry和year的位置:

3. 将索引与变量互换

使用 .reset_index([]) 可以将索引变成列变量。

使用 .set_index([]),也可以讲变量变成索引:

4. 数据透视表

大家都用过excel的数据透视表,把行标签和列标签随意的布局,pandas也可以这么实施,使用 .unstack() 即可:

四、数据的导入导出

1. 数据导入

表格型数据可以直接读取为DataFrame,比如用 read_csv 直接读取csv文件:

有文件testSet.csv:

存在D盘下面,现在读取:

发现了一个问题——第一行被当做变量名了!所以要指定 header=None

变量名变成了0、1,还是变扭啊,我们来指定个变量吧:

names= 可以指定变量名。

看到var1那列,如果想用这列做索引,咋办?好办!

index_col= 即可指定索引。

除了read_csv,还有几种读取方式:

函数

说明

read_csv

读取带分隔符的数据,默认分隔符为逗号

read_table

读取带分隔符的数据,默认分隔符为制表符

read_fwf

读取固定宽格式数据(无分隔符)

read_clipboard

读取剪贴板中的数据

read_table可以读取txt的文件,说到这里,想到一个问题——如果txt文件的分隔符很奇怪怎么办?

比如——

这个testSet.txt文件用“loves”做分隔符!

隐隐觉得有人向我表白,但是有点恶心......

在实际中,更可能是某种乱码,解决这种特殊分隔符,用 sep= 即可。

忽略红色背景的部分。

还有一种情况是开头带有注释的:

使用 skiprows= 就可以指定要跳过的行:

从我多年统计师从业经验来看,学会了如何跳过行,也要学如何读取某些行,使用 nrows=n 可以指定要读取的前n行,以数据

为例:

2. 数据导出

导出csv文件使用 data.to_csv 命令:

data.to_csv(outFile, index=True, encoding='gb2312')

index=True 指定输出索引,当数据中有中文的时候用 encoding= 来解码,否则会出现乱码,一般 gb2312 即可,有些例外的情况用 gb18030 基本都能解决。

无私的把日记给大家分享,觉得我帅也赞一下吧,越多人觉得我帅,我就越想公开越多的日记给大家看。

因为我帅啊~

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-03-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数说工作室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档