之前我们也写过一些python数据分析相关方面的文章例如《python系列-100条处理dataframe的语句》、《python series处理60句 + 字符串处理40句》、《python函数对应的同样功能的sas函数》。这些文章都从不同角度介绍了python实现数据分析。今天我们从数据分析实际工作的角度跟大家交流下。
数据处理阶段
一般地,我们知道在进行数据分析之前,我们需要对数据先做一定的处理,才能得出我们的目标。例如我们需要分析广东省深圳市的GDP,先需要对数据进行筛选,进一步地,我们还对不需要的数据进行删除。这两种方式涉及到对数据的删除过滤和数据的整体性改造,这部分内容可以定义为数据的修改。而再进一步地,我们的GDP数据如果包含了不一致的单位,还需要对GDP的数据进行转换,这部分内容可以定义为数据的转换。
数据的修改
数据的修改用到的过滤函数主要有loc函数、drop、dropnan、rename函数等。
loc函数主要用来选择数据集的子集,主要就两个方向,提取行数据、提取列数据。
操作数据为:
loc_dataOut[288]: A B C Da 0 1 2 3b 4 5 6 7c 8 9 10 11d 12 13 14 15e 16 17 18 19f 20 21 22 23g 24 25 26 27h 28 29 30 31
提取行数据
通过索引来获取行
loc_data.loc['a']Out[289]: A 0B 1C 2D 3Name: a, dtype: int64
通过行号来获取行
loc_data.iloc[0]Out[291]: A 0B 1C 2D 3Name: a, dtype: int64
获取指定行c、d行和A、B列
loc_data.loc[['c','d'],['A','B']]Out[293]: A Bc 8 9d 12 13
通过条件获取指定行
==用法
loc_data[loc_data['B']==1] Out[307]: A B C Da 0 1 2 3
isin用法
loc_data[loc_data['A'].isin([4,8])] Out[308]: A B C Db 4 5 6 7c 8 9 10 11
==结合&用法
loc_data[(loc_data['A']==12)&(loc_data['B']==13)] Out[309]: A B C Dd 12 13 14 15
isin结合|用法
loc_data[(loc_data['A'].isin([24]))|(loc_data['B'].isin([25,29]))] Out[312]: A B C Dg 24 25 26 27h 28 29 30 31
删除数据
删除数据数据常用的函数有drop、dropna等, drop函数主要也是两个方向,删除行数据、删除列数据。
删除列数据
loc_data_new = loc_data.drop('D',1)loc_data_newOut[324]: A B Ca 0 1 2b 4 5 6c 8 9 10d 12 13 14e 16 17 18f 20 21 22g 24 25 26h 28 29 30
删除行数据
loc_data_new = loc_data.drop('a',0)loc_data_newOut[327]: A B C Db 4 5 6 7c 8 9 10 11d 12 13 14 15e 16 17 18 19f 20 21 22 23g 24 25 26 27h 28 29 30 31
dropna函数用于删除数据中的空值,这里删除D列中的空行
loc_data.dropna(subset=['D'],how='any')Out[406]: A B C D NEWBa 0 1 2 3.0 Bb 4 5 6 7.0 Bc 8 9 10 11.0 Be 16 17 18 19.0 Bf 20 21 22 23.0 Bg 24 25 26 27.0 Bh 28 29 30 31.0 B
数据的转换
数据的转换用到的过滤函数主要有map函数、apply函数、applymap等,能够实现大部分的转换需求。
map函数使用方法为,首先选取我们需要转换的列,在map函数里面针对所选取的列设定我们的转换关系,例如把1转成A,5转成B,29转成D
通过字典设转换关系
loc_data['B'].map({1:'A',5:'B',29:'D'})Out[337]: a Ab Bc NaNd NaNe NaNf NaNg NaNh DName: B, dtype: object
同样我们可以通过函数来设转换关系
def change(x): y='A' if x==1 else 'B' return y loc_data['B'].map(change)Out[362]: a Ab Bc Bd Be Bf Bg Bh BName: B, dtype: object
apply函数与map函数不一样的地方在于,apply函数能够传入多个参数实现更复杂的操作,例如我想对列NEWB进行拼接新的字符'a',这是就需要传入额外的参数'a',需要用到apply函数。当然apply函数还有更复杂的应用,这里描述比较简单的。
'''先定义函数'''def append(x,bias): y=x+bias return y'''让apply函数使用所定义的函数'''loc_data['NEWB']=['B']*len(loc_data)loc_data['NEWB'].apply(append,args=('a'))Out[370]: a Bab Bac Bad Bae Baf Bag Bah BaName: NEWB, dtype: object
applymap的用法相对比较简单,与前面两个函数不同,主要是针对整一个数据集,例如我们先把数据集中的数值型数据挑选出来,再对这些数据保留4位小数显示
loc_data_n = loc_data.drop('NEWB',axis=1)loc_data_n.applymap(lambda x:"%.4f" % x)Out[376]: A B C Da 0.0000 1.0000 2.0000 3.0000b 4.0000 5.0000 6.0000 7.0000c 8.0000 9.0000 10.0000 11.0000d 12.0000 13.0000 14.0000 15.0000e 16.0000 17.0000 18.0000 19.0000f 20.0000 21.0000 22.0000 23.0000g 24.0000 25.0000 26.0000 27.0000h 28.0000 29.0000 30.0000 31.0000
汇总分析阶段
汇总分析阶段主要针对处理完的已有数据进行一些统计分析,偏向于展示, 不涉及原有数据的更改。也就是常说的描述性统计。第一个最常用的数据为describe,输出数据的整体描述,包括数据的行数统计、平均值、标准差、最小最大值、标准差、各个分位数等等。
loc_data_n.describe()Out[377]: A B C Dcount 8.000000 8.000000 8.000000 8.000000mean 14.000000 15.000000 16.000000 17.000000std 9.797959 9.797959 9.797959 9.797959min 0.000000 1.000000 2.000000 3.00000025% 7.000000 8.000000 9.000000 10.00000050% 14.000000 15.000000 16.000000 17.00000075% 21.000000 22.000000 23.000000 24.000000max 28.000000 29.000000 30.000000 31.000000
如果还想分步实现以上的每一种统计的话,可以单独运行每种方法对应的语句。
'''单独实现count、mean、std等等'''loc_data_n.count()Out[379]: A 8B 8C 8D 8dtype: int64loc_data_n.mean()Out[380]: A 14.0B 15.0C 16.0D 17.0dtype: float64loc_data_n.std()Out[381]: A 9.797959B 9.797959C 9.797959D 9.797959dtype: float64loc_data_n.min()Out[382]: A 0B 1C 2D 3dtype: int64loc_data_n.max()Out[383]: A 28B 29C 30D 31dtype: int64'''实现分位数统计,在q里面设定'''loc_data_n.quantile(q=0.75)Out[385]: A 21.0B 22.0C 23.0D 24.0Name: 0.75, dtype: float64
还能从列的维度进行统计,以sum函数举例
loc_data_n.sum(axis='columns')Out[386]: a 6b 22c 38d 54e 70f 86g 102h 118dtype: int64
进一步地,我们想统计累计和
loc_data_n.cumsum()Out[387]: A B C Da 0 1 2 3b 4 6 8 10c 12 15 18 21d 24 28 32 36e 40 45 50 55f 60 66 72 78g 84 91 98 105h 112 120 128 136
与sum函数对比
loc_data_n.sum()Out[388]: A 112B 120C 128D 136dtype: int64
数据展示阶段
在数据进行汇总统计之后,我们还需要通过一些可视化的操作。同样都为数据分析的展示,一图胜千言,可视化的重要性主要在于给人一目了然的效果,特别是相对比较关心结果的领导和客户。我们可以在已经处理好的数据的基础上通过一些函数在图表上进行展现。
plot函数,主要用于简单绘制某列的趋势,这里以B列为例
loc_data_n['B'].plot()
loc_data_n['A'].plot(kind ='bar')
loc_data_n['A'].plot(kind='barh')
相应地,还可以对整体数据集来画柱状图
loc_data_n['A'].plot(kind='barh')
![b644fbd72acd828a17fb74a33dc3ded8.png](https://i-blog.csdnimg.cn/blog_migrate/19cac5e0e45c3f4ecc96e542946f7c64.png)
当把数据放到二维坐标上表示,可以使用散点图,散点图能够描绘数据直接的关系这里的例子中把x轴当成数据A列,y轴当成数据B列
loc_data_n.plot(kind='scatter',x='A',y='B')
![356fa1876bd4534876380e0d500ec49c.png](https://i-blog.csdnimg.cn/blog_migrate/2aaa1cb9fa18d2916a5bee544c81dc73.png)
总结