微信号:shushuojun

介绍:数据分析师之家.旨在为数据人提供一个学习、分享、互帮互助的家园.

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

2016-03-30 07:29 数说君


本文是【统计师的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 基本都能解决。



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


因为我帅啊~



1. 关于数据分析的提问求助直接在微信后台留言。


2. 转载、投稿、免费发布招聘、合作,请加数说君个人微信AnselT,或Email:jiayounet@163.com。

数说工作室

数据分析师之家 | 金融 生物 零售 互联网

微信ID:shushuojun


长按二维码关注数说工作室

 
数说工作室 更多文章 导语:SAS正则表达式,统计师入门文本分析的捷径 讨论 | 数据分析的价值 日本 | 医疗大数据值得关注的3个方向 统计师的Python日记【第6天:数据合并】
猜您喜欢 成为一名更好的程序员:如何阅读源代码 移动端前端开发真机调试攻略 今天不虐狗,因为设计师有约了... 正交试验法 常用 Svn 命令清单