当前位置: 首页 > 后端技术 > Python

用pandas进行实战数据分析

时间:2023-03-26 15:43:52 Python

安装pandas模块包,加载练习数据。在pandas中,常用的加载函数是read_csv。另外还有read_excel和read_table,table可以读取txt。对于服务器相关的部署,也会使用read_sql直接访问数据库,但是必须配合mysql相关的包。read_csv有很多参数,encoding是最常用的参数之一,用来读取csv格式的编码。这里我们使用gb2312,在windows中很常见。如果报错,可以试试utf-8。sep参数是一个分隔符。有的csv文件用逗号分隔列,有的用分号,有的用\t。这些需要专门设置。header参数是是否使用表头作为列名。names参数可以为列设置额外的名称。比如csv里面的header是中文的,但是pandas里面最好转成英文。通过输出,我们可以看到表格的行数和列数,但是由于篇幅原因,省略了显示中的一些数据。我们可以通过调整显示器的长宽来显示更多的文件信息。因为数据集有很多数据,如果我们只想浏览部分,可以使用head函数,将数据显示在头部,默认5条,也可以自由设置参数。如果是tail数据,就是tail。如果不设置head函数参数,输出结果如下:将head函数参数值设置为7,结果输出如下:positionId为仓位ID,唯一,我们通过这个检查重复数据柱子。我们只得到5031个唯一值,但是根据表有6876条数据,我们需要清除重复数据。使用drop_duplicates删除重复数据。drop_duplicates函数使用subset参数来选择将哪一列用作去重基准。keep参数是保留方式,first是保留第一个,剩下的重复值删除,last是删除前一个,保留最后一个。重复的函数类似,但它返回一个布尔值。接下来,处理工资数据。计算工资底线和工资上限。薪资内容无特殊规定。既有小写k也有大写K,还有k及以上的用法。k以上,默认只有上下限相同。这里需要用到pandas中的apply。它可以对DataFrame中的一行或一列数据进行操作,允许使用自定义函数。定义一个cut_word函数,找到“-”符号的位置,截取薪资区间开头到K之间的数字,也就是我们想要的薪资上限。apply将cut_word函数应用于salary列中的所有行。对于写在k以上的数据,查找函数将返回-1。如果按照原来的方式截取,会是word[:-2],这不是我们想要的结果,所以需要加一个if判断。因为python是区分大小写的,所以我们使用upper函数将k转换为K,然后用K作为截距。输出bottomSalary和topSalary值。下一步是解决平均工资。在计算平均工资之前,我们需要先将要使用的数据转换成int类型再进行计算。数据类型转换为数字,这里引入一个新的知识点,匿名函数lambda作为一次性函数使用。lambdax:*,前面的lambdax:被解释为输入,后面的星号区域是对输入x进行操作。在这种情况下,由于top和bottom是同时取平均值的,所以需要加上x.bottomSalary和x.topSalary。word_cut的apply是针对Series的,现在是DataFrame。axis为apply中的参数,axis=0表示使用行中的函数,axis=1为列。输出结果如下图。数据清洗完成后,我们会选择我们要分析的数据进行后续分析。这里仍然可以使用head、tail函数等设置参数查看首末部分数据。下面介绍几个数据统计。value_counts是计数,统计所有非零元素的个数,按降序输出Series。StatisticsofCITY:StatisticsofEducation:工资统计,我们使用Describe函数描述符函数快速生成各种统计指标。平均工资17k,中位数15k,最高工资75k。标准差8.99k,有一定波动,大部分薪水在17±9k之间。一般value_counts用于分类数据,describe用于数值数据。这是两个最常用的统计函数。pandas自带绘图功能,是基于matplotlib包的,所以两者可以结合使用。使用hist函数绘制直方图非常方便。图表列出了薪水的分布,因为大部分薪水都集中在20k以下,为了更细的粒度。继续减小直方图的宽度。数据分析的一个主要思想是细分维度。现在观察不同城市、不同教育背景对薪资的影响。箱线图是查看它的最佳方式。图表的标签有问题,出现白框。主要原因是图表默认使用英文字体,而这里都是中文,导致冲突。所以你需要改用matplotlib。boxplot是我们调用的boxplot函数,column选择boxplot的值,by选择分类变量,figsize是size。从图中可以看出,北京的工资高于其他城市,尤其是中位数。上海和深圳略逊一筹,广州甚至不如杭州。修改分类变量为教育,得到教育对薪资影响的箱线图。以上两项研究均为单变量分析。现在想知道北京和上海的学历对工资的影响。通过传入多个值,箱线图的刻度会自动变成元组,达到横向比较的效果。在pandas中,当需要同时分析多个维度时,可以使用groupby函数。类似于SQL中的groupby,可以对不同的变量进行分组。上图是标准用法,针对不同的城市,按照城市栏目进行分组。但是,它不返回分组结果,只返回内存地址。这时候只是一个对象,没有任何计算,现在调用groupby的count方法。返回不同城市的每一列的计数结果,因为没有NaN,所以每一列的结果是相等的。它现在等同于value_counts。换成mean,计算不同城市的平均工资。因为mean方法只针对数值,而且每一列只有aveSalary是数值,所以返回这个唯一的结果。groupby可以传递一组list,然后得到一组分层的Series。平均工资按城市和教育组计算。后面调用unstack方法将行和列调换,这样可以看得更清楚。不同城市中,深圳的博士工资最高,杭州的硕士工资最高。北京综合薪资最好。)这次我们改成count,在groupby后面加一个avgSalary,表示只统计avgSalary的统计结果,相同的数据不用混。图表上的结果非常清楚。只有6个职位需要博士学位。所谓的平均工资只取决于公司开出的价格,波动性很大。毕竟这只是招聘工资,并不代表博士真正的在职工资。.这也解释了上面图表中的异常情况。接下来,计算不同公司雇佣的数据分析师的数量,并计算平均值。这里使用了agg函数,同时传入count和mean方法,然后返回不同公司的count和average结果。所以上面的mean和count其实省略了agg。除了系统自带的几个函数外,agg还支持自定义函数。上图使用lambda函数返回不同公司最高薪和最低薪的差值。agg是一个非常方便的函数,可以对分组的列数据进行丰富多彩的计算。但它并不是pandas分组计算中最灵活的功能。接下来,我要统计不同城市需要招聘数据分析师的前5家公司。agg虽然可以返回count和sort,但是返回的是所有的结果,前五名还是需要手动计算。所以我们使用apply来操作。自定义函数topN,统计传入的数据,从大到小返回前5个数据。然后按城市聚合分组,因为我们要找前5家公司,所以调用companyShortName的topN函数。同样,如果想知道不同城市每个职位的前五名招聘情况,也可以直接调用topN。agg与apply不同。虽然一些方法是相似的,例如sum和count,但apply支持更细的粒度。它可以按组进行复杂的操作,拆分和合并数据,而agg必须固定为一列。使用groupby,我们已经能够随意组合不同的维度。接下来配合groupby进行映射。多个聚合的绘制没有太大区别,只是不要把行列数据转置搞混了。以上图例是使用pandas-encapsulated方法绘制的。如果想更自由的可视化,直接调用matplotlib函数会更好,兼容pandas和numpy。plt已在上面调用和命名。上图以直方图的形式对比了上海和北京的薪资数据。由于北京和上海的分析师数量相差甚远,无法直接比较。必须使用目标参数转换为密度。设置alpha透明度,比boxplot更直观。另一种分析思路是对数据进行进一步处理。我们设置了不同级别的工资。cut用于bucketing,也是数据分析常用的方法。它将不同的数据划分为不同的层次,即将数值型数据处理成分类数据,广泛应用于机器学习的特征工程中。使用lambda转换百分比,然后制作堆积百分比柱状图(matplotlib好像没有可以直接调用的函数)。在这里可以清楚的看到不同地区不同职级的薪资比例。它相对于箱线图和直方图的优势在于它通过手动划分具有商业意义。0-3是实习生的价格,3-6是刚毕业没基础的新人,整理资料,6-10有一定基础,以此类推。下面会统计分组标签栏中的数据。str方法允许我们对列中的元素进行字符串相关的处理。这里[1:-1]不再是DataFrame和Series的切片,而是字符串截取。在这里,[]被拦截。如果缺少str,则变为从Series的第二行到最后一行中选择数据。使用str之后,还是返回Series,当我们想再次使用replace去除空格的时候。仍然需要添加str。positionLabels本身有空值,所以删掉,不然容易报错。再次使用str.split方法,将元素中的标签按“,”分割成一个列表。通过apply和value_counts函数统计标签的数量。因为每一行的元素都已经转换成列表,value_counts会逐行计算列表中的labels,apply函数会将value_counts应用到该行,最后用结果组成一个新表。使用unstack完成行列转换看起来有点奇怪,因为它统计的是所有标签在每个位置出现的次数,而且大部分肯定是NaN。删除空值并重置为DataFrame。此时level_0为标签名,level_1为df_index的索引,也可以认为是对应一个位置,0为标签在该位置出现的次数。有些位置的标签可能出现多次,这里忽略。reset_index可以恢复索引,返回默认的整型索引。最后使用groupby计算标签出现的次数。清理掉引号,设置词云相关的参数。因为在jupyter中显示图片,所以需要额外配置figsize,否则wide和height的配置无效。wordcloud也兼容pandas,所以直接传入结果,然后显示图片,不用坐标。