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下载地址:点击下载

相关文章
|
2月前
|
Python
如何根据Excel某列数据为依据分成一个新的工作表
在处理Excel数据时,我们常需要根据列值将数据分到不同的工作表或文件中。本文通过Python和VBA两种方法实现该操作:使用Python的`pandas`库按年级拆分为多个文件,再通过VBA宏按班级生成新的工作表,帮助高效整理复杂数据。
|
2月前
|
数据采集 数据可视化 数据挖掘
用 Excel+Power Query 做电商数据分析:从 “每天加班整理数据” 到 “一键生成报表” 的配置教程
在电商运营中,数据是增长的关键驱动力。然而,传统的手工数据处理方式效率低下,耗费大量时间且易出错。本文介绍如何利用 Excel 中的 Power Query 工具,自动化完成电商数据的采集、清洗与分析,大幅提升数据处理效率。通过某美妆电商的实战案例,详细拆解从多平台数据整合到可视化报表生成的全流程,帮助电商从业者摆脱繁琐操作,聚焦业务增长,实现数据驱动的高效运营。
|
14天前
|
SQL 数据挖掘 BI
数据分析的尽头,是跳出数据看数据!
当前许多企业在数据分析上投入大量资源,却常陷入“数据越看越细,业务越看越虚”的困境。报表繁杂、指标众多,但决策难、行动少,分析流于形式。真正有价值的数据分析,不在于图表多漂亮,而在于能否带来洞察、推动决策、指导行动。本文探讨如何跳出数据、回归业务场景,实现数据驱动的有效落地。
|
2月前
|
Python
将Excel特定某列数据删除
将Excel特定某列数据删除
|
存储 数据处理 索引
Python操作Excel常用方法汇总
Python操作Excel常用方法汇总
432 0
|
开发者 Python
Python 操作 Excel 全攻略 | 包括读取、写入、表格操作、图像输出和字体设置
Python 操作 Excel 全攻略 | 包括读取、写入、表格操作、图像输出和字体设置
1772 0
|
Python
补充python操作excel示例xlwings常用函数
补充python操作excel示例xlwings常用函数
221 0
|
数据采集 数据可视化 Python
Python操作excel写入读取数据,简单实用
Python操作excel写入读取数据,简单实用
|
Python
Python操作excel基础
Python操作excel基础
236 0
Python操作excel基础
|
数据挖掘 BI 数据库
【Python】我用xlrd、xlwt操作Excel
本篇内容介绍了“怎么用Python来操作Excel”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让我带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
【Python】我用xlrd、xlwt操作Excel

热门文章

最新文章