本文是【统计师的Python日记】第5天的日记
回顾一下:
第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基本都能解决。
无私的把日记给大家分享,觉得我帅也赞一下吧,越多人觉得我帅,我就越想公开越多的日记给大家看。
因为我帅啊~