Python数据分析库Pandas实战:解析Excel数据

简介: Python数据分析库Pandas实战:解析Excel数据

上一节Python操作Excel表格使用的是openpyxl包,这个包虽然能处理简单日常工作中Excel表格数据处理,但面对机器学习庞大的数据,还是显得力不从心,所以openpyxl大多数应用于简单的Excel表格操作,以及机器学习分析后表格的样式优化,但针对于数据的操作运算,我们还是要借助与pandas。


1.安装Pandas


对于直接下载python安装程序的用户来说,pandas包并没有自带安装,所以需要使用Pandas的程序员,需要借助于pip install pandas进行安装。(数据表格与源代码在文章最后下载)

import pandas as pd
df = pd.read_excel('shuju.xlsx')
df['s_date'] = pd.to_datetime(df['s_date'])
df = df.set_index('s_date')
#每月某用户总评论量
x = []
y = []
data = df[df['s_nameId'] == '择城终老'].resample('M')['s_comment'].max().reset_index(drop=False)
for index, row in data.iterrows():
    if pd.isnull(row['s_comment']):
        y.append(0)
    else:
        y.append(row['s_count'])
    x.append(str(row['s_date'].year)[-2:] + str(row['s_date'].month))
print(x)
print(y)


而直接使用anaconda安装python的程序员,可以直接使用pandas包,因为anaconda自带安装了pandas,无需再次安装,推荐使用这种方式进行安装。


2.如何使用Pandas包


对于Pandas来说,首先,我们肯定要先获取Excel文件,才能进行后续的操作以及计算,所以我们需要掌握如何获取到Excel表格中的所有数据,代码如下:

import pandas as pd
df = pd.read_excel('shuju.xlsx')

这里我们先引入了pandas包,并且重新给他起了一个简单的名字pd,然后直接使用pd.read_excel(‘文件路径’),把Excel数据读取进来,我们通过print(df)打印来看看表格中的数据,如图:


26.png


可以看到表格中有3151行数据,这样就能直接输出打印,也就是说,通过上面的调用,就已经获取了所有的数据,并不需要像openpyxl还要获取表,列行等操作。


下面的内容需要借助表数据进行分析,所以我们有必要先看看表格结构,如下图所示,上面是博主爬取花粉俱乐部的些许数据,这里有发帖时间(s_date),发帖人(s_nameId),帖子标题(s_tite),帖子链接(s_url),帖子阅读量(s_count),帖子评论量(s_comment),是否盖章(s_gaizhang),以及该帖子的类型(s_device)。


27.png


获取某用户所有月份的发帖量

假设我现在有一个需求,需要获取某月每个人的发帖量,那么应该怎么操作呢?


既然是每个月,我们肯定要用时间来区分,所以我们需要先格式化时间格式,让pandas能读的懂时间,代码如下:

df['s_date'] = pd.to_datetime(df['s_date'])

这句话的代码就是将该列转换为时间格式,然后重新赋值给该列,这样后续才能用时间来操作。接着我们需要将该时间列设置为索引,代码如下:

df = df.set_index('s_date')

这样设置之后,我们的表格就变成了,如下图所示的样式:


28.png


刚才是数字索引,现在变为时间索引,这样我们就可以用索引进行分类了,既然是统计每月数据,所以应该根据每月进行分类,代码如下:

data = df[df['s_nameId'] == '择城终老'].resample('M').count().reset_index(drop=False)

首先获取所有某用户的数据,比如这里获取“择城终老”的数据,就是df[df['s_nameId']=='择城终老'],获取某人数据,或者某列数值的所有行,都可以这样获取。接着resample('M'),M代码月,根据月进行取样,然后count()统计该月数据和,然后reset_index(drop=False)取消时间作为索引,方便后面获取月份,这样就获取了某个人的所有月份发帖子量,输出如下图所示(print(data)):


29.png


这里可以看到每列都是和运算,所有数据都相同,只要遍历虽然获取某格数据都是一样的,代码如下,比如我要输出走势图,这里X是月,Y是该月帖子总数,代码如下:

x=[]
y=[]
for index, row in data.iterrows():
    y.append(row['s_url'])#获取该月帖子总和数
    x.append(str(row['s_date'].year)[-2:] + str(row['s_date'].month))//获取当前年月

这段代码输出的结果如下,分别输出了Y,与X:


30.png


这里是根据月份获取某人某月总帖子数,那么获取总浏览量呢?其实只只需要将count()总和换成sun()就行,代码如下:

data = df[df['s_nameId'] == self.name_id].resample('M').sum().reset_index(drop=False)
for index, row in data.iterrows():
    y.append(row['s_count'])
    x.append(str(row['s_date'].year)[-2:] + str(row['s_date'].month))

当然这里只能获取row['s_count']不能像统计行数一样统计总和,因为本身就的就是总浏览量,只有数字列才能算总和,而且其他列并不是浏览量,是如下数据:


31.png


其实这里还算出了总评论量,大家只要把row['s_count']换成row['s_comment']就能知道总评论量的数据了。


获取某人某月最大浏览量数据

现在我们又变更了需求,这里我想知道,某个人写的最好的帖子,看的人数最多,或者评论人数最多的帖子是哪个,应该则么做呢?其实这里的代码基本差不多,都需要根据时间索引获取,代码如下:

import pandas as pd
df = pd.read_excel('shuju.xlsx')
df['s_date'] = pd.to_datetime(df['s_date'])
df = df.set_index('s_date')
x = []
y = []
data = df[df['s_nameId'] == '择城终老'].resample('M')['s_count'].max().reset_index(drop=False)
for index, row in data.iterrows():
    if pd.isnull(row['s_count']):
        y.append(0)
    else:
        y.append(row['s_count'])
    x.append(str(row['s_date'].year)[-2:] + str(row['s_date'].month))
print(x)
print(y)


这里除了max()不同外,基本与上面代码相同,但这里有个小问题,假如某人某月没有输出任何帖子,简单来说这个月没有任何数据,他的最大值就是NaN,如下:


32.png


看到索引5的数据了吗,也就是说,2018年5月,该人没有任何数据,那么计算的最大值就是NaN,所以如果你要获取该值做图,或做其他用途,要么跳过,要么给他赋值为0。pd.isnull()就是判断该值是否为NaN的方法。


同样这里获取了浏览量的最大值,我们要获取评论量的最大值,只需要改两行代码:

data = df[df['s_nameId'] == '择城终老'].resample('M')['s_comment'].max().reset_index(drop=False)
if pd.isnull(row['s_comment']):

把代码改一下就可以获取某人某月最大评论量的数据,输出的结果与上面类似,只是将s_count列换成了s_comennt列。


获取某人某月输出占比数据

获取某人某月输出占比数据这个需求与画饼图有关,就是百分比图,那么我们应该怎么做才能获取到某月所有用户的总数,以及该月所有用户各个输出贴数呢?因为获取到这两个数据才能计算百分比。这里将用到分组,代码如下:

df['s_date'] = pd.to_datetime(df['s_date'])
df = df.set_index('s_date')
name_df = df.groupby('s_nameId', as_index=False)

这里我们因为要获取某个人的占比图,所以必须先根据用户名进行分组,as_index这个参数只是输出样式,不影响结果,这里是以“SQL风格”的分组输出,当然,我们这里还是需要以时间作为索引,所以还是有前两句代码,下面是输出样式。


33.png


既然已经进行了分组,也就是说每个用户的数据都已经到手,就可以依次遍历某个人的数据,然后统计该人的每月总数数据,总的所有人该月的发帖数,代码如下:

x = []
y = []
for name, group in name_df:
    data = group.resample('M').count().reset_index(drop=False)
    data2 = data[data['s_date'] == '2018-01-31']
    if len(data2.values.tolist()) <= 0 or data2.values.tolist()[0][3] <= 0:
        continue
    else:
        x.append(data2.values.tolist()[0][3])
        y.append(name)
print(x)
print(y)

这里我们遍历了刚才的分组,获得了某个用户的name,group,name就是name_id,group是该用户的所有数据。具体的name_id与group数据如下图所示:


34.png


然后通过月份统计出该每月的总数data,然后根据索引月份获取该月的数据,同时如果该月该用户没有数据,选择不统计,跳过,只统计有数据的,这里data2是一个表DataFrame,我们需要将他转化为ndArray然后转换为list后,在获取数据,看看输出的X,Y的数据,如下:


35.png


上面的数据就是2018年1月每个人输出的帖子数,其实饼图并不需要计算百分比,你只需要把上面数据输入到饼图中,会自动计算百分比的,也就是matplotlib包的pie图。


本文源代码Github下载地址:点击下载

相关文章
|
6月前
|
Java 数据挖掘 数据处理
(Pandas)Python做数据处理必选框架之一!(一):介绍Pandas中的两个数据结构;刨析Series:如何访问数据;数据去重、取众数、总和、标准差、方差、平均值等;判断缺失值、获取索引...
Pandas 是一个开源的数据分析和数据处理库,它是基于 Python 编程语言的。 Pandas 提供了易于使用的数据结构和数据分析工具,特别适用于处理结构化数据,如表格型数据(类似于Excel表格)。 Pandas 是数据科学和分析领域中常用的工具之一,它使得用户能够轻松地从各种数据源中导入数据,并对数据进行高效的操作和分析。 Pandas 主要引入了两种新的数据结构:Series 和 DataFrame。
653 0
|
7月前
|
监控 数据可视化 数据挖掘
Python Rich库使用指南:打造更美观的命令行应用
Rich库是Python的终端美化利器,支持彩色文本、智能表格、动态进度条和语法高亮,大幅提升命令行应用的可视化效果与用户体验。
678 0
|
6月前
|
数据可视化 关系型数据库 MySQL
【可视化大屏】全流程讲解用python的pyecharts库实现拖拽可视化大屏的背后原理,简单粗暴!
本文详解基于Python的电影TOP250数据可视化大屏开发全流程,涵盖爬虫、数据存储、分析及可视化。使用requests+BeautifulSoup爬取数据,pandas存入MySQL,pyecharts实现柱状图、饼图、词云图、散点图等多种图表,并通过Page组件拖拽布局组合成大屏,支持多种主题切换,附完整源码与视频讲解。
641 4
【可视化大屏】全流程讲解用python的pyecharts库实现拖拽可视化大屏的背后原理,简单粗暴!
|
6月前
|
传感器 运维 前端开发
Python离群值检测实战:使用distfit库实现基于分布拟合的异常检测
本文解析异常(anomaly)与新颖性(novelty)检测的本质差异,结合distfit库演示基于概率密度拟合的单变量无监督异常检测方法,涵盖全局、上下文与集体离群值识别,助力构建高可解释性模型。
522 10
Python离群值检测实战:使用distfit库实现基于分布拟合的异常检测
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
504 2
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
1259 29
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
519 4
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
移动开发 前端开发 JavaScript
从入门到精通:H5游戏源码开发技术全解析与未来趋势洞察
H5游戏凭借其跨平台、易传播和开发成本低的优势,近年来发展迅猛。接下来,让我们深入了解 H5 游戏源码开发的技术教程以及未来的发展趋势。
|
存储 前端开发 JavaScript
在线教育网课系统源码开发指南:功能设计与技术实现深度解析
在线教育网课系统是近年来发展迅猛的教育形式的核心载体,具备用户管理、课程管理、教学互动、学习评估等功能。本文从功能和技术两方面解析其源码开发,涵盖前端(HTML5、CSS3、JavaScript等)、后端(Java、Python等)、流媒体及云计算技术,并强调安全性、稳定性和用户体验的重要性。

热门文章

最新文章

推荐镜像

更多