it速查手册(学习python中的pandas有没有好的教程推荐)

伏羲号

Python的pandas库是使Python成为用于数据分析的出色编程语言的一件事。Pandas使导入,分析和可视化数据变得更加容易。它建立在NumPy和matplotlib之类的软件包的基础上,使您可以方便地进行大部分数据分析和可视化工作。

it速查手册(学习python中的pandas有没有好的教程推荐)

在此Python数据科学教程中,我们将使用Eric Grinstein抓取的数据,使用Pandas分析来自流行的视频游戏评论网站IGN的视频游戏评论。哪个主机赢得了“控制台大战”(就游戏的审查而言)?该数据集将帮助我们找出答案。

当我们分析视频游戏评论时,我们将了解关键的Pandas概念,例如索引。您可以继续进行下去,并在我们的许多其他Python教程之一中或通过注册Python Pandas课程来了解有关Python和Pandas的更多信息。我们的许多其他数据科学课程也都使用Pandas。

谨记一下,本教程使用Python 3.5编写,并使用Jupyter Notebook构建。您可能使用的是Python,pandas和Jupyter的更新版本,但结果应该基本相同。

用Pandas导入数据

如果您正在使用本教程,则需要下载数据集,您可以在此处进行操作。

我们将采取的第一步是读取数据。数据以逗号分隔的值或csv文件存储,其中每行用换行分隔,每列用逗号(,)分隔。这是ign.csv文件的前几行:

如您在上方看到的,文件中的每一行代表一个游戏,该游戏已经过IGN审查。这些列包含有关该游戏的信息:

1)score_phrase— IGN如何用一个词形容游戏。这链接到它收到的分数。

2)title -游戏名称。

3)url —您可以在其中查看完整评论的URL。

4)platform -审查游戏的平台(PC,PS4等)。

5)score—游戏的得分,从1.0到10.0。

6)genre —游戏类型。

7)editors_choice- N如果游戏不是编辑选择的Y话,那么是。这与得分息息相关。

8)release_year -游戏发布的年份。

9)release_month -游戏发布的月份。

10)release_day -游戏发布的那天。

还有一个前导列,其中包含行索引值。我们可以放心地忽略此列,但稍后将深入探讨哪些索引值。

为了在Python和pandas中有效地处理数据,我们需要将csv文件读取到Pandas DataFrame中。DataFrame是表示和处理表格数据的一种方式,表格数据是表格形式的数据,例如电子表格。表格数据具有行和列的格式,就像我们的csv文件一样,但是如果我们可以将其作为表格查看,则对我们来说更易于阅读和排序。

为了读入数据,我们需要使用pandas.read_csv函数。此函数将接收一个csv文件并返回一个DataFrame。以下代码将:

a.导入pandas库。我们将其重命名为,pd以便更快地输入。这是数据分析和数据科学中的标准约定,您经常会看到导入的Pandas就像pd其他人的代码一样。

b.读ign.csv入一个DataFrame,并将结果分配给一个名为的新变量,reviews以便我们可以reviews用来引用我们的数据。

读完DataFrame后,以更直观的方式看一下我们所获得的内容将很有帮助。Pandas方便地为我们提供了两种方法,可以快速地将数据打印到表中。这些功能是:

1)DataFrame.head()—打印DataFrame的前N行,其中N是您作为参数传递给函数的数字,即DataFrame.head(7)。如果不传递任何参数,则默认值为5。

2)DataFrame.tail()—打印DataFrame的最后N行。同样,默认值为5。

我们将使用该head方法查看其中的内容reviews:

我们还可以访问pandas.DataFrame.shape属性,以查看以下行reviews:

如我们所见,所有内容均已正确读取-我们有18,625行和11列。

与类似的NumPy这样的Python软件包相比,使用Pandas的一大优势是Pandas允许我们拥有具有不同数据类型的列。在我们的数据集中,reviews我们有存储浮点值(如)score,字符串值(如score_phrase)和整数(如)的列release_year,因此在此处使用NumPy会很困难,但Pandas和Python可以很好地处理它。

现在我们已经正确地读取了数据,让我们开始建立索引reviews以获取所需的行和列。

用Pandas索引DataFrames

之前,我们使用了该head方法来打印的第一5行reviews。我们可以使用pandas.DataFrame.iloc方法完成同样的事情。该iloc方法允许我们按位置检索行和列。为此,我们需要指定所需行的位置以及所需列的位置。下面的代码将reviews.head()通过选择行0到5,以及数据集中的所有列来复制我们的结果:

让我们更深入地研究我们的代码:我们指定了想要的rows 0:5。这意味着我们想要从position 0到(但不包括)position的行5。

第一行被认为是在位置0,所以选择行0:5给了我们行的位置0,1,2,3,和4。我们也需要所有列,并且使用快捷方式来选择它们。它的工作方式是这样的:如果我们不喜欢第一个位置值,例如:5,那是假设我们的意思0。如果我们忽略了最后一个位置值(如)0:,则假定我们是指DataFrame中的最后一行或最后一列。我们需要所有列,因此只指定了一个冒号(:),没有任何位置。这使我们的列从0到最后一列。以下是一些索引示例以及结果:

1)reviews.iloc[:5,:]—第一5行,以及这些行的所有列。

2)reviews.iloc[:,:] —整个DataFrame。

3)reviews.iloc[5:,5:]—从位置5开始的行,从位置开始的列5。

4)reviews.iloc[:,0] —第一列,以及该列的所有行。

5)reviews.iloc[9,:] —第十行,以及该行的所有列。

按位置索引与NumPy索引非常相似。如果您想了解更多信息,可以阅读我们的NumPy教程。现在我们知道了如何按位置索引,让我们删除第一列,该列没有任何有用的信息:

在Pandas中使用标签在Python中建立索引

既然我们知道如何按位置检索行和列,那么值得研究使用DataFrames的另一种主要方法,即按标签检索行和列。与NumPy相比,Pandas的主要优势在于,每一列和每一行都有一个标签。可以处理列的位置,但是很难跟踪哪个数字对应于哪个列。

我们可以使用pandas.DataFrame.loc方法处理标签,该方法允许我们使用标签而不是位置进行索引。我们可以reviews使用以下loc方法显示前五行:

上面的内容实际上与并没有太大的不同reviews.iloc[0:5,:]。这是因为尽管行标签可以采用任何值,但我们的行标签与位置完全匹配。您可以在上方表格的最左侧看到行标签(它们以粗体显示)。您还可以通过访问DataFrame 的index属性来查看它们。我们将显示的行索引reviews:

reviews.index

Int64Index([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, ...], dtype='int64')

不过,索引不一定总是与位置匹配。在下面的代码单元中,我们将:

a.获取行10至行20的reviews,并分配结果some_reviews。

b.显示的第一5行some_reviews。

如上所示,在中some_reviews,行索引始于,10结束于20。因此,尝试loc使用小于10或大于的数字20将导致错误:

some_reviews.loc[9:21,:]

如前所述,在使用数据时,列标签可以使工作变得更加轻松。我们可以在loc方法中指定列标签,以按标签而不是按位置检索列。

我们还可以通过传入列表来一次指定多个列:

Pandas系列对象

我们可以通过几种不同的方式在Pandas中检索单个列。到目前为止,我们已经看到了两种语法:

1)reviews.iloc[:,1] —将检索第二列。

2)reviews.loc[:,"score_phrase"] —还将检索第二列。

还有第三种甚至更容易的方法来检索整列。我们可以在方括号中指定列名称,例如使用字典:

我们还可以通过以下方法使用列列表:

当我们检索单个列时,实际上是在检索Pandas Series对象。DataFrame存储表格数据,而Series存储数据的单列或单行。

我们可以验证单个列是否为系列:

我们可以手动创建系列以更好地了解其工作原理。要创建一个Series,我们在实例化它时将一个列表或NumPy数组传递给Series对象:

系列可以包含任何类型的数据,包括混合类型。在这里,我们创建一个包含字符串对象的系列:

在Pandas中创建一个DataFrame

我们可以通过将多个Series传递到DataFrame类中来创建DataFrame。在这里,我们传入刚刚创建的两个Series对象,

s1作为第一行,s2作为第二行:

我们还可以使用列表列表完成同样的事情。每个内部列表在结果DataFrame中被视为一行:

我们可以在创建DataFrame时指定列标签:

以及行标签(索引):

还请注意,不需要缩进和单独的行。我们已经以这种方式编写了代码,以使其更易于解析,但是您经常会遇到将它们全部写成一行的情况。例如,以下代码将产生与我们在本段上方的表中看到的结果完全相同的结果:

无论如何,添加标签后,便可以使用它们对DataFrame进行索引:

columns如果将字典传递给DataFrame构造函数,则可以跳过指定关键字参数的操作。这将自动设置列名称:

PandasDataFrame方法

如前所述,pandas DataFrame中的每一列都是Series对象:

我们可以在Series对象上调用与在DataFrame上可以调用的大多数相同的方法,包括head:

Pandas Series和DataFrames还具有其他使计算更简单的方法。例如,我们可以使用pandas.Series.mean方法来查找Series的均值:

我们还可以调用类似的pandas.DataFrame.mean方法,该方法默认情况下将查找DataFrame中每个数字列的平均值:

我们可以修改axis关键字参数以mean计算每行或每列的平均值。默认情况下,axis等于0,并将计算每列的平均值。我们还可以将其设置1为计算每行的平均值。请注意,这只会计算每行中数值的平均值:

reviews.mean(axis=1)

0 510.500

1 510.500

2 510.375

3 510.125

4 510.125

5 509.750

6 508.750

7 510.250

8 508.750

9 509.750

10 509.875

11 509.875

12 509.500

13 509.250

14 509.250

...

18610 510.250

18611 508.700

18612 509.200

18613 508.000

18614 515.050

18615 515.050

18616 508.375

18617 508.600

18618 515.025

18619 514.725

18620 514.650

18621 515.000

18622 513.950

18623 515.000

18624 515.000

Length: 18625, dtype: float64

Series和DataFrames上有很多类似的方法mean。这里有一些方便的东西:

1)pandas.DataFrame.corr —查找DataFrame中各列之间的相关性。

2)pandas.DataFrame.count —计算每个DataFrame列中非空值的数量。

3)pandas.DataFrame.max —在每一列中找到最大值。

4)pandas.DataFrame.min —查找每一列中的最小值。

5)pandas.DataFrame.median —查找每列的中位数。

6)pandas.DataFrame.std —查找每列的标准偏差。

例如,我们可以使用该corr方法查看是否有任何列与关联score。这可以告诉我们最近发布的游戏获得了更高的评价(release_year),还是在年底之前发布的游戏获得了更好的评分(release_month):

正如我们在上面看到的那样,我们的数字列都没有与关联score,因此我们知道发布时间与评论评分并不线性相关。

DataFrame Math与Pandas

我们还可以使用pandas在Python中的Series或DataFrame对象上执行数学运算。例如,我们可以将score列中的每个值除以2以将刻度从0– 切换10到0– 5:

reviews["score"] / 2

0 4.50

1 4.50

2 4.25

3 4.25

4 4.25

5 3.50

6 1.50

7 4.50

8 1.50

9 3.50

10 3.75

11 3.75

12 3.50

13 4.50

14 4.50

...

18610 3.00

18611 2.90

18612 3.90

18613 4.00

18614 4.60

18615 4.60

18616 3.75

18617 4.20

18618 4.55

18619 3.95

18620 3.80

18621 4.50

18622 2.90

18623 5.00

18624 5.00

Name: score, Length: 18625, dtype: float64

所有常用的数学运算符在Python的工作,如+,-,*,/,和^将在系列或DataFrames大Pandas的工作,并且将适用于每一个元素在一个数据帧或一个系列。

Pandas中的布尔索引

现在我们已经了解了一些Pandas的基础知识,让我们继续进行分析。我们前面看到的,平均都在值的score列reviews左右7。如果我们想找到所有得分都高于平均水平的游戏怎么办?

我们可以先进行比较。比较会将“系列”中的每个值与指定值进行比较,然后生成一个“系列”,其中包含表示比较状态的布尔值。使用Python Pandas分析视频游戏数据https://www.aaa-cg.com.cn/data/2310.html例如,我们可以看到哪些行的score值大于7:

score_filter = reviews["score"] > 7

score_filter

0 True

1 True

2 True

3 True

4 True

5 False

6 False

7 True

8 False

9 False

10 True

11 True

12 False

13 True

14 True...

18610 False

18611 False

18612 True

18613 True

18614 True

18615 True

18616 True

18617 True

18618 True

18619 True

18620 True

18621 True

18622 False

18623 True

18624 True

Name: score, Length: 18625, dtype: bool

有了布尔系列后,我们可以使用它来选择DataFrame中该系列包含value的行True。所以,我们只能选择行reviews,其中score大于7:

可以使用多个条件进行过滤。假设我们要查找针对发行Xbox One的得分超过的游戏7。在下面的代码中,我们:

a.设置两个条件的过滤器:

1)检查是否score大于7。

2)检查是否platform相等Xbox One

b.应用过滤器以reviews仅获取所需的行。

c.使用head方法打印的第一5行filtered_reviews。

在使用多个条件进行过滤时,将每个条件放在括号中并用一个&符号(&)分隔是很重要的。

Pandas图

现在我们知道如何过滤,我们可以创建图以观察的回顾分布Xbox One与的回顾分布PlayStation 4。这将帮助我们确定哪个控制台具有更好的游戏。

我们可以通过直方图来做到这一点,该直方图将绘制不同得分范围内的频率。我们可以使用pandas.DataFrame.plot方法为每个控制台制作一个直方图。该方法利用幕后的流行Python绘图库matplotlib生成美观的绘图。

该plot方法默认为绘制折线图。我们需要传入关键字参数kind="hist"来绘制直方图。在下面的代码中,我们:

a.致电%matplotlib inline以在Jupyter笔记本中设置绘图。

b.过滤reviews以仅包含有关的数据Xbox One。

c.绘制score列。

我们也可以对PS4:

从我们的直方图中可以看出,与相比,PlayStation 4具有更高评级的游戏Xbox One。

显然,这只是冰山一角,涉及到我们可以用来分析该数据集的潜在方向,但我们已经有了一个很好的开端:我们已经使用Python和pandas导入了数据集,并学会了使用各种不同的索引方法选择我们想要的数据点,并进行了一些快速的探索性数据分析,以回答我们开始时遇到的问题。

https://www.toutiao.com/i6832518344541733380/

Section B

Directions: In this section, you are going to read a passage with ten statements attached to it. Each statement contains information given in one of the paragraphs. Identify the paragraph from which the information is derived. You may choose a paragraph more than once. Each paragraph is marked with a letter. Answer the questions by marking the corresponding letter on Answer Sheet 2.

A Grassroots Remedy

A) Most of us spend our lives seeking the natural world. To this end, we walk the dog, play golf, go fishing, sit in the garden, drink outside rather than inside the pub, have a picnic, live in the suburbs, go to the seaside, buy a weekend place in the country. The most popular leisure activity in Britain is going for a walk. And when joggers (慢跑者) jog, they don't run the streets. Every one of the minstinctively heads to the park or the river. It is my profound belief that not only do we all need nature, but we all seek nature, whether we know we are doing so or not.

我觉得Excel最逆天操作就是做自动化模板,日常工作的周报月报只需要点击刷新,马上得到结果。以下所有图表模板均由Excel制作,无插件!花了5天时间,总结出50+数据看板的精华!

首先,放一个视频,科普一下数据看板的酷炫之处。

请私信回复【数据看板】,可免费获取一份简单的数据看板资料。

作为一名跟Excel打交道5年的 @运营菌 ,发现许多人根本不清楚什么是自动化Excel模板、可视化的【数据大屏】,接下来我要介绍的Excel看板保证让你打开新的世界大门,它只需要简单替换数据源,就能生成一页纸的【数据可视化报告】。

00.Excel数据看板的强大

通过上面的视频可以知道,Excel数据看板的强大之处就是让不熟悉Excel的小白,直接套用原有的模板,就能自动生成直观好看的数据可视化报告,通过交互逐步展示分析数据。

首先跟大家科普一下,【Excel数据看板】的工作原理:

①更换数据源前的效果:

②新增数据源,只需要把数据粘贴在后面即可

③更换数据源后的展示

④这些报表还能通过切片器筛选,这样就能得到这样交互效果啦↓

E00.数据看板知识点

在我这几年的工作生涯做了20多份的数据看板,重点是这些强大好用的模板我基本都保存下来,如今把相关做【数据看板】的心得整理下来,希望能帮助到大家能更快更好套用或做出【数据大屏】报告。

以下图表均有Excel制作,无插件,均可实现动态交互的效果。

E01.个人做过的数据看板(部分)

00.基础图表

这个数据看板包含了13种Excel必学的基础图表,此处以2016版本为准,所以新增的树状图、旭日图、瀑布图和直方图均包括进去了。利用数据看板的方法,方便大家比较,和记忆对于各种图表的对比也更加深刻。

01.财务运营模板

在财务会计的同学,经常加班是常事。但又经常干不过写PPT的,所以,会懂做一个镇得住场子的数据看板非常重要。当老板问你财务情况时,你可以变操作边分析给老板看。

主要的指标有:收入、总支出、利润。收入渠道占比,支出各渠道占比。

在配色和排版上主要参考了下面的数据看板,是不是长得非常相似呢?

02.电商运营看板

目前我国的电商非常发达,跨境电商也逐渐发展起来,对于数据的分析要求也越来越高。对于没有编程基础的同学,利用Excel和线上工具协助工作非常重要的。

越来越多大平台,淘宝/天猫,京东、拼夕夕等均有统一的数据源端口,为数据的自动化处理打下良好的基础。通过数据大屏的分析衡量直通车效益,客户喜欢的产品等做分析,帮助制定下一步的运营策略。

主要指标有:销售额,重点品类,热销单品,客户复购率,销售趋势等。

03.人事运营看板

员工为什么跑了?是钱不给够么,与门店的领导有关?所以,我们做这些决策时候,都有数据得到支持。

重要指标有:工资支出,税费缴纳,男女占比,兼职全职占比,员工工资分布,劳务支出等人工费用支出。

04.微信月报

自公众号红利期过去后,许多大号的崛起均是依靠着精细化的运营崛起。如:长图汽车站,半佛仙人等。对当下热点的敏感度、社会的洞察,以及对数据的敏感判断均有助提升运营效果。依靠着内容,依然能在微信公众号上猥琐发育起来。

经历过一年多的运营,终于能够依靠自媒体养活自己,目前公众号2.2万粉,知乎3万粉,头条7万粉。

公众号重点指标有:关注用户,阅读量、打开率,供稿量,新增用户等。涉及了公众号所有关键指标,可以通过实践的纵向深度分析近个月出现的问题。

微信月报v1.0

月报2.0

微信周报

微信周报↑

E02.如何快速制作一个好看的数据看板

许多人以为做出这样的一个数据看板要很麻烦,要花费很多时间,其实只需要10分钟就可以轻松制作一个数据看板。不信,你看↓

数据大屏的要素是:多表联动+良好的逻辑+优秀排版+配色+图表,即可制作出这样好看的数据大屏。大家看了这么多数据大屏,觉得它们很酷炫,你觉得最吸引你的地方是什么?

个人从中总结出2方便主要内容:①运动:多数据关联变化,②好看:排版+配色+图表

E02.如何实现数据的联动?

数据联动底层是逻辑,可以通过透视表或Excel函数实现联动。在数据联动上,主要是考察逻辑的合理性。实现数据关联有4种情况,①切片器链接多个透视表,②多个切片器与多个透视表,③切片器链接多个数据源。

1.一个切片器链接多个透视表

来自同一个数据源的多个【透视表】,可以通过一个【切片器】把它们链接起来。选择切片器后,右击【链接报表】,即可选择多个需要链接的透视表。

2.多个透视表与多个切片器

如果看吧里面不止一个切片器,那么这些【切片器】就会链接不同或相同的透视表,我们也是通过右击【报表链接】选择需要链接的透视表。

每个透视表有具体名称和看到的工作表

01.用【岗位名称】切片器控制①②③④透视表 02.用【门店】切片器控制③④透视表

如果切片器比较多的情况下,比较考验我们的排版能力,这里给大家总结出四个超实用的排版技巧。总共有5种版式排布

1.上下版式

01.利用边框线,或者形状做切片器控制区域划分

2.左右版式

利用与底色有差异的颜色做切片器地盘划分,此处应用了灰色。

3.单独切片器

利用单元格作图法或把图表底色换成与表格颜色一致,把图表和切片器看成一个整体

4.混合版式

需要在标题上加以说明或区分

3.一个切片器链接多个数据源

切片器无法直接链接多个数据源,链接其他数据源需要通过【链接单元格】实现控制。首先把切片器选择引用到单元格上,再用Excel函数以【链接单元格】作为抽取条件。

01链接原理

注:切片器无法直接链接多个数据源,可通过“链接单元格”间接链接多个数据源,要求有该数据源之间有“相同的字段”

切片器动态图表有4要素:①数据源+②选择器+③作图数据源→④动态图表

切片器控制其他数据源要素:①数据源+②选择器+链接单元格+抽数引擎+③作图数据源→④动态图表

本案例中一共有2个数据源:难点在于如何与第二个数据源的链接。

02链接实操

01.首先我们要插入透视表后,接着插入切片器,利用2个数据源共同字段作为切片器筛选条件。题目中,2个数据源均有日期,于是利用日期作为切片器。

02.我们把切片器的字段移动到筛选区,细心发现切片器筛选的字段右边有小漏斗图的图标,如图:

03.首先把切片器选择变化,从数据透视表直接用"="引用,,=号引用的单元格充当了链接单元格作用。

04.利用切片器筛选的月份作为条件,对数据源2进行统计汇总等,此处利用了sumifs函数作为抽数引擎。

05.利用统计好的数据作为作图数据源,做出对应的 图表

06.当我们切片器选择变化的时候,链接单元格变化引起作图数据源变化,从而形成动态图表。

E03.排版+配色1.在哪里有优秀的数据大屏样式参考?

(1)专业的数据大屏分析网站

这类网站,如网易数读、腾讯云等专门帮客户做【数据大屏】的网站最佳,我们不仅可以参考大屏样式设计,遇到同行业还可以参考哪些关键指标。

推荐指数:★★★★★

网易数读:温氏养殖数据监控大屏

腾讯云数据大屏

(2)参考专业的设计网站

专业的设计网站也有设计师做数据大屏样式,如:花瓣网、站酷等,此类数据看板更多是着重在设计上,业务上偏弱。

推荐指数:★★★★☆

(3)直接搜索引起搜集

这种方法或许最快捷,但搜集出来的内容难以保证图片质量。

推荐指数:★★★★

2.如何模仿别人优秀的数据大屏样式?

把上面三种途径自己喜欢❤的数据大屏样式下载,或通过截屏也可,例如我们看上了这个数据大屏样式。

找到参考的数据大屏样式原型

把它拖动到Excel中,利用插入形状,把放置的位置用形状描绘出来,用来定位。我们描绘好的定位大概如下。

3.如何正确在数据大屏添加图标、png/背景图片等

(1)背景图片可以在专业的设计网站寻找

推荐指数:★★★★

把原来的参考样式的图片抽离掉或删掉,保留刚刚绘制用于定位的形状,通过【页面布局】【背景图片】插入适合的背景图片。

删掉原来图片,调整形状透明度和更换背景图片可得。

数据大屏的【排版布局】基本告一段落。

(2)背景图片可以在对应产品官网寻找

推荐指数:★★★★★

一般大公司或者产品,均有对应的官方网站,如游戏产品有精美的游戏插画如:王者荣耀、和平精英、阴阳师等

②科技产品的官网:手机、电脑、无人机等

在【页面布局】【背景图片】即可设置,把查看的【网格线】去掉更佳哦

(3)在觅元素找PNG、光效素材

恰当使用一些光效或PNG素材,使得我们数据大屏增色不少。

E03.配色

学习配色之前有限了解office的主题构成,分别是颜色、字体、效果三部分构成。

1.在哪里可以快速学到优秀的配色方案?

(1)套用Excel系统自带的配色

推荐指数:★★★★☆

通过【页面布局】【主题】【颜色】点击,就可以找到Excel系统自带的10多种配色,可以满足一般办公需求。

(2)参考我们排版时模仿的数据大屏的配色

推荐指数:★★★★★

(3)专业的配色网站

推荐指数:★★★★☆

安利这个PPT导航的网站给大家,

(4).参考专业的图表网站:

网站地址:https://www.echartsjs.com/zh/index.html

2.如何正确设置和应用office主题配色方案?

设置主题颜色前,我们最好能系统了解每个颜色的顺序代表什么意思的,例如字体、背景、系列着色,超链接,总共有10个颜色,他们的分配为:2、2,6、2

在【页面布局】设置颜色有12种,但在页面选择颜色只显示10种,省略超链接的颜色显示。

为了方便大家,我们特意弄了一个配色面板,例子中使用的百度Echart的配色方案,最后的超链接颜色,建议不要修改,因为之前形成强大的用户习惯,看到蓝色就容易代入是超链接。

如果我们配色一个柱形图,配色自动生成如下。不难发现,柱形的颜色分别是从着色1到着色6,所以我们也叫5-10号色为系列色

如何提取数据看板颜色

以找到的数据大屏样式为例,通过屏幕截图,逐个提取颜色的RGB值。

对应的颜色有以下:

通过【主题】【颜色】【自定义】,给对应颜色输入RGB的颜色值,例如第一个RGB(147,227,246)……

输入后,需要提取命名名称,建议名称以【颜色】风格命名,方便自己后续二次使用。

3.如何应用自己设置好的【主题】配色?

我们通过【主题】【颜色】即可一键更换不同的配色风格了,如果你的表格颜色不能变化,请看4课时的内容。

颜色可以应用在Excel表格的点、线、面、文字上,具体的有条件格式、图表、形状,迷你图,样式等8种形式。

4.如何把不规范的主题应用快速更正?

在任何可以设置颜色的元素:形状、字体、单元格、图表等,如果发现更换主题颜色方案时,但颜色没有变化,那就是设置有问题。我们需要把对应的元素逐个通过【主题色】设置。

当表格颜色不随【主题】切换而变化,可以通过【样式】选择,就可以快速统一可以变化的样式。

5.如何快速套用别人设置的主题配色

如果我们想将别人的主题颜色,应用到自己的表格上,可以通过自定义颜色,直接修改名字保存即可。因为这些颜色就是原来表格的主题色。此处以系统自带模板的配色做演示。

①保存别人的配色

②把配色应用到自己做的表格上

6.如何把主题色应用在新建的表格上?

设置好主题【颜色】【字体】【效果】,我们就给他们起一个名字,最好以配色风格起名,这套配色能有应用在自己的任何工作簿上,和新建工作簿上。

通过【主题】,保存当前主题,保存在默认地方即可。在【主题】即可看到自定义的主题。

7.如何把主题应用在新的工作簿上

通过主题设置可以变换,但新建的工作簿还是原来的主题,我们可以通过【设置模板】,达到新建的工作簿即应用我们想要的【主题】

【文件】【另存为】模板格式.xltx。在【文件】【新建】【个人】即可找到自定义的模板。

08.偷懒大法:直接拷贝别人的office主题过来

当别人家做出了整套主题后,我们可以把他们copy过来。问题来了,应该在哪里找,复制哪些文件,复制掉哪里位置?

①当我们不知道位置是,点击【页面布局】【主题】【保存当前主题】,这里就能看到她们衣柜(主题)的位置。下面长成.thmx的都是她们的衣服(主题)

才2套,真的穷

②直接选中Ctrl+C,即可复制她们的主题

③粘贴到自己的衣柜即可,可以通过选择保存主题,查看自己衣柜的位置。

④我们回到Excel或PPT的页面布局,就可以通过这切换主题。

09.设置的主题可以在PPT与Excel共用的

我们设置好的主题和配色其实叫office主题,所以PPT与Excel均可以共用的。当我们在任一软件保存了主题或配色方案即可。

以上就是系统跟大家复盘的【数据大屏】有关于【多表联动】+【配色】+【排版】的方法和应用,接下来就看看具体的案例。我们就以电商报表作为例子,带大家完整看一个【数据大屏】是如何做出来的。

E07.电商数据大屏

电商主要从流量渠道,爆款单品,主营品类等。还可以从销售客户分析,客户接受价位多少,有哪些黄金会员、忠实粉丝。

1.明确分析目的

在获得数据源之后,我们首先要判断是否要做【数据大屏】,能否满足:①重要性高,②高频次使用 2个重要特点。

例如根据电商行业的特点,我们列出了如下需求:

1.销售额和销量分别是多少?

2.销售额对比/同比情况?

3.热销品类是哪些,爆款是什么?

4.做了哪些推广,有什么效果?

5.客户有多少人,经常购买的客户怎样?

6……

2.参考数据大屏排版+排版

为了方便容错率和使得排版更工整,我们把列缩小到【3】,整个表格形成无数个小正方形。

参考数据大屏页面,利用形状或单元格填充颜色,把大致的轮廓描绘出来。

编辑时按住ALT键可以锚定到单元格的边界上,得到的边界轮廓大概如下图,之后我们在边框上依次填充图表即可。

除了模仿【数据大屏】的排版之外,我们还要把他们的配色依次提取出来,如下图的数据看板我们分别提取出下图配色。

提取出配色后,在【页面布局】设置【主题颜色】。

3.数据分析

对第一步的需求进行挖掘分析,利用【透视表】对数据分析。由于这部分内容在透视表也讲过比较多遍,只需要简单汇总,求和/计数,排序等就能轻松应对。如果不熟悉透视表,可以详细看一下这篇回答内容:如何使用 Excel 透视表?

利用【切片器】链接多个透视表,右击切片器把相关的报表链接起来。这里还有个小技巧,可以在第一个透视表插入【切片器】,然后再复制透视表,【切片器】也能链接到复制的【透视表】,不需要重复链接透视表。

4.依次填充图表

在图表可视化方面,主要是考验大家对基础图表掌握知识。此前有过一定图表基础的同学都是非常容易就能做出以下的图表。现在就挑一些比较有代表性的图表分析一下。

01.大屏数字

这种大屏数字,有种像天猫双十一销售额大屏,它由具体的销售额拆分成了多个单元格。

首先,我们预计这个数值有多少位数,提前预留好足够的位数。因为选择不同的时间段,数值会发生变化,无法确定准确的位数。此处我们需要用到一个Excel函数。

语法

=QUOTIENT(numerator, denominator)

=QUOTIENT(被除数, 除数)

这里的返回是整数的商,有余数的均省略余数,例如:

=QUOTIENT(7, 3)的结果为2,余数1不会显示。

例如我们现在把123456789拆分到小数后2位,利用公式QUOTIENT拆分,利用right函数提取可得:

【商】所在列公式:=QUOTIENT($A$2,B2)

【末位】所在列公式:=RIGHT(C2,1)

上面看到每个数字放置的空隙,是用形状做成的效果,我们在【插入】,选择【形状】选中圆角矩形,就可以拖动画出一个形状。

按住Ctrl+shift 拖动复制形状

选中形状,在编辑栏依次输入=,刚刚拆分出来数字,把省下的数字依次引用过来。

02.渐变柱形图

这里的条形图和面积图,均用了渐变的颜色表达,看起来很有科技感,这种实现难度为0。

画出条形图后,右击【设置图表格式】,找到【填充】选择渐变填充。

把颜色浮标留下2个,一个设置蓝色,另外一个设置紫色,滑动颜色浮标可以调整位置。

03.条件格式

此处红旗运用了条件格式,值得注意是每行数据的底色是有细微的差别的,这种细微配色不同,让人看起来比单纯一个颜色更舒服。

红旗这里是有数字的,=销售额数字,现在显示看不到时通过【条件格式】把它省略。

选择数值所在列,在【开始】【条件格式】找到【图标集】,选择

在图标选择的右侧,选择【仅显示图标】,把这个√打上,即可隐藏数值。

添加了边框装饰

添加了光效

04.动态图表标题

点击切片器中不同的城市,标题也跟着相应的变化,如何实现这样的动态图表标题?

切片器的变化,会引起透视表发生表,从透视表可以实现这样的效果。选择【广州】时,把【城市】字段放置在筛选区,筛选单元格会出现广州。

接着通过=引用这个单元格就能实现,动态图表标题的效果。

想选择全部是出现了【华南】,这需要+多一个单元格进行转化。

公式:=IF(AC1="(全部)","华南",AC1)

05.修改切片器颜色

日常中,我们见到的切片器大多是这样的颜色的,这些都是系统根据【主题色】自带的模板颜色

01.浅色模板

优点:方便、快捷

缺点:线条过于插眼,不够美观,未选择的选项过于突出

02.深色模板

优点:方便、快捷,弱化了没有选中选项

缺点:线条过于插眼,不够美观

建议Excel比较基础的同学,直接选择第二款深色模板即可,因为【切片器】化妆难度,不是一般人能学会。

03.自定义模板

肯定有同学好奇,我做的这个模板,为什么如此与众不同呢?

因为当我们的背景是深色时候,还是采用默认的模板配色,肯定是翻车的,不信你看。

这些【切片器】就会抢尽风头,特别的刺眼。

04.设置配色

切片器的配色在【切片器工具】【新建切片器】样式。

切片器中有许多选项,必须要修改的样有三样:①整个切片器;②已选择带有数据项目;③已取消选择带有数据项目

下面通过图片,介绍一下3个选项分别呈现出哪些。

对切片器设置主要设置【字体】【边框】【填充】颜色,3个颜色设置,这里我们边框均设置无。由于是深色的背景,所以统一设置了白色的字体。

修改后样式,我们可以给样式命名,如【Excel数据可视化】,接着保存。

选择原有的【切片器】,在【切片器工具】【切片器样式】选择刚刚自定义的【Excel数据可视化样式】,即可。

这样就能很好实现了【切片器】美化的效果,记得上面的操作,面对什么的底色均能做出一个搭配的【切片器】美妆。

以上就是有关于【数据看板】的做法,如果有兴趣的朋友可以参加有本人特意录制的课程,里面有丰富的教程和课件、模板。

请私信回复【数据看板】,可免费获取一份简单的数据看板资料。

全力以赴地进入数据集是从事数据科学工作的任何人的使命之一。通常,这意味着要进行数字运算,但是当我们的数据集主要基于文本时,我们该怎么办?我们可以使用正则表达式。在本教程中,我们将仔细研究如何在Python中使用正则表达式(regex)。

正则表达式(regex)本质上是文本模式,可用于自动搜索和替换文本字符串中的元素。这可以使清理和使用基于文本的数据集变得更加容易,从而省去了手动搜索大量文本的麻烦。

正则表达式可以在多种编程语言中使用,并且已经存在很长时间了!

不过,在本教程中,我们将学习Python中的正则表达式,因此需要基本熟悉关键的Python概念,例如if-else语句,while和for循环等。在本教程结束时,您将熟悉Python regex的工作原理,并能够使用Python regex模块中的基本模式和功能re来分析文本字符串。您还将获得有关正则表达式如何与熊猫配合使用以处理大型文本语料库的介绍。

让我们深入研究有关每个人最不喜欢的电子邮件类型的一些数据:垃圾邮件和欺诈。

我们的任务:分析垃圾邮件

在本教程中,我们将使用Kaggle的欺诈电子邮件语料库。它包含1998年至2007年之间发送的数千种网络钓鱼电子邮件。它们非常有趣,易于阅读。

您可以在这里找到完整的语料库。但是,我们将从使用一些电子邮件学习基本的正则表达式命令开始。如果需要,您也可以使用我们的测试文件,也可以在完整的语料库中尝试使用。

介绍Python的Regex模块

首先,我们将通过打开测试文件,将其设置为只读并读取来准备数据集。我们还将其分配给变量fh(用于“文件句柄”)。

请注意,我们在目录路径之前加r。此技术将字符串转换为原始字符串,这有助于避免某些机器读取字符的方式引起的冲突,例如Windows上目录路径中的反斜杠。

现在,假设我们要找出电子邮件的来源。我们可以自己尝试使用原始Python:

但这并没有给我们确切的需求。如果您看一下我们的测试文件,我们可以找出原因并修复它,但是,让我们使用Python的re模块并使用正则表达式来做吧!

我们将从导入Python的re模块开始。然后,我们将使用一个名为的函数re.findall(),该函数返回在正在查看的字符串中定义的模式的所有实例的列表。

外观如下:

这与原始Python的长度基本相同,但这是因为这是一个非常简单的示例。您尝试做的越多,Python正则表达式就可以为您节省更多的精力。

在继续之前,让我们仔细看看re.findall()。此函数采用形式为的两个参数re.findall(pattern, string)。在这里,pattern代表我们要查找的子字符串,并string代表我们要在其中查找的主字符串。主字符串可以包含多行。在这种情况下,我们让它fh使用选定的电子邮件来搜索所有文件。

该.*是一个字符串模式的简写。正则表达式通过使用这些速记模式来查找文本中的特定模式而起作用,因此让我们看一下其他一些常见示例:

常见的Python正则表达式模式

我们re.findall()上面使用的模式包含一个完整拼写的字符串"From:"。当我们确切地知道我们要查找的内容(精确到实际字母以及它们是否为大写或小写)时,这很有用。如果我们不知道我们想要的字符串的确切格式,我们将会迷路。幸运的是,正则表达式具有解决此情况的基本模式。让我们看看在本教程中使用的那些:

1)w匹配字母数字字符,表示az,AZ和0-9。它还与下划线_和破折号-相匹配。

2)d 匹配数字,表示0-9。

3)s 匹配空白字符,包括制表符,换行符,回车符和空格字符。

4)S 匹配非空格字符。

5).匹配除换行符外的任何字符n。

掌握了这些正则表达式模式后,您将在继续进行解释的同时快速理解上面的代码。

使用正则表达式模式

现在,我们可以.*在re.findall("From:.*", text)上面的行中解释的用法。让我们.先来看:

通过在.旁边添加一个From:,我们可以在其旁边查找另一个字符。因为.查找除以外的任何字符n,所以它捕获了我们看不到的空格字符。我们可以尝试更多的点来验证这一点。

看起来加点确实为我们获得了线的其余部分。但是,这很繁琐,而且我们不知道要添加多少点。这是星号符号*出现的位置。

*匹配模式左侧的零个或多个实例。这意味着它将寻找重复模式。当我们寻找重复的模式时,我们说搜索是“贪婪的”。如果我们不寻找重复的模式,则可以将搜索称为“非贪婪”或“懒惰”。

让我们构建一个贪婪的搜索.用*。

因为*匹配在其左侧指示的模式的零个或多个实例,并且.位于此处的左侧,所以我们能够获取From:字段中的所有字符,直到行尾。这将用精美简洁的代码打印出整行。

我们甚至可以更进一步,仅隔离名称。让我们使用它re.findall()来返回包含模式的行列表,"From:.*"就像之前一样。match为了整洁,我们将其分配给变量。接下来,我们将遍历列表。在每个循环中,我们将re.findall再次执行,匹配第一个引号以仅选择名称:

注意,我们在第一个引号旁边使用了反斜杠。反斜杠是一个特殊字符,用于转义其他特殊字符。例如,当我们想将引号用作字符串文字而不是特殊字符时,可以使用反斜杠将其转义,例如:\"。如果我们不使用反斜杠转义上面的模式,它将变为"".*"",Python解释器将其读取为两个空字符串之间的句点和星号。它将产生错误并破坏脚本。因此,至关重要的是我们在这里用反斜杠将引号引起来。

匹配第一个引号后,.*获取行中的所有字符,直到下一个引号也被转义为模式。这使我们得到的名称只是带引号的名称。该名称也打印在方括号中,因为re.findall返回的匹配项在列表中。

如果我们想要电子邮件地址怎么办?

看起来很简单,不是吗?仅模式不同。让我们来看一看。

这是我们仅匹配电子邮件地址的前部分的方式:

电子邮件总是包含一个@符号,因此我们从它开始。电子邮件中@符号前的部分可能包含字母数字字符,这w是必需的。但是,由于某些电子邮件包含句点或破折号,所以这还不够。我们添加S以查找非空白字符。但是,w\S只会得到两个字符。添加*以查找重复。因此,模式的前部如下所示:\w\S*@。

现在查看@符号后面的模式:

域名通常包含字母数字字符,句点和短划线,因此a .可以。为了使它更贪婪,我们使用扩展了搜索范围*。这使我们可以匹配任何字符,直到行尾。

如果我们仔细观察这条线,会发现每封电子邮件都封装在尖括号<和>中。我们的模式.*包括右括号>。让我们对其进行补救:

电子邮件地址以字母数字字符结尾,因此我们将模式设置为w。因此,在@符号后面有.*\w,这表示我们想要的模式是一组以字母数字字符结尾的任何类型的字符。不包括>。

因此,我们的完整电子邮件地址格式如下所示:\w\S*@.*\w。

!这需要花费很多时间。接下来,我们将介绍一些通用re功能,这些功能在开始重新组织语料库时将非常有用。

常用的Python正则表达式函数

re.findall()无疑是有用的,但它不是我们可以使用的唯一内置函数re:

1)re.search()

2)re.split()

3)re.sub()

在使用它们为我们的数据集添加一些顺序之前,让我们一一看一下。

研究()

While re.findall()匹配字符串中某个模式的所有实例并在列表中返回它们,re.search()匹配字符串中一个模式的第一个实例,并将其作为re匹配对象返回。

像一样re.findall(),re.search()也有两个参数。第一个是要匹配的模式,第二个是要在其中找到模式的字符串。在这里,我们将结果分配给match变量以保持整洁。

由于re.search()返回re匹配对象,因此无法通过直接打印来显示名称和电子邮件地址。相反,我们必须首先对该group()函数应用该函数。我们已经在上面的代码中打印了这两种类型。如我们所见,group()将match对象转换为字符串。

我们还可以看到,打印match显示的属性超出字符串本身,而打印match.group()仅显示字符串。

re.split()

假设我们需要一种快速的方法来获取电子邮件地址的域名。我们可以通过三个正则表达式操作来做到这一点,如下所示:

第一行很熟悉。我们返回一个字符串列表,每个字符串包含From:字段的内容,并将其分配给变量。接下来,我们遍历列表以查找电子邮件地址。同时,我们循环访问电子邮件地址,并使用该re模块的split()功能将每个地址切成两半,用@符号作为分隔符。最后,我们打印它。

re.sub()

另一个方便的re功能是re.sub()。就像函数名称所暗示的那样,它替换字符串的一部分。一个例子:

我们之前已经在第一行和第二行看到了任务。在第三行,我们re.sub()在上应用address,这是From:电子邮件标题中的完整字段。

re.sub()需要三个参数。第一个是要替换的子字符串,第二个是我们要替换的字符串,第三个是主字符串本身。

正则表达式与pandas

现在,我们掌握了Python正则表达式的基础知识。但是通常对于数据任务,我们实际上并没有使用原始的Python,而是使用了pandas库。现在,将我们的正则表达式技能带入熊猫工作流程,将其提升到一个新的水平。

如果您以前从未使用过熊猫,请不要担心。我们将逐步遍历代码,以免您迷路。但是,如果您想更详细地了解熊猫,请查看我们的熊猫教程或我们提供的有关numpy和熊猫的完全交互式课程。

使用Python Regex和Pandas对电子邮件进行排序

我们的语料库是一个包含数千封电子邮件的单个文本文件(不过,同样,在本教程中,我们使用的是一个只有两个电子邮件的较小文件,因为在整个语料库上打印正则表达式工作的结果会使这篇文章过长)。

我们将使用正则表达式和熊猫将每封电子邮件的各个部分分类为适当的类别,以便可以更轻松地阅读或分析语料库。

我们将每封电子邮件分为以下类别:

1)sender_name

2)sender_address

3)recipient_address

4)recipient_name

5)date_sent

6)subject

7)email_body

这些类别中的每一个都将成为我们的熊猫数据框(即我们的表格)中的一列。这将使我们更轻松地分别处理和分析每个列。

我们将继续处理我们的小样本,但是值得重申的是,正则表达式使我们可以编写更简洁的代码。简洁的代码减少了我们的机器必须执行的操作数量,从而加快了我们的分析过程。使用我们的两封电子邮件的小文件,并没有太大的区别,但是,如果您尝试使用和不使用正则表达式来处理整个语料库,您将开始看到其优势!

准备脚本

首先,让我们导入所需的库,然后再次打开文件。

除了re和之外pandas,我们email还将导入Python的软件包,这将有助于电子邮件的正文。仅使用正则表达式时,电子邮件的主体相当复杂。它甚至可能需要足够的清理才能保证有自己的教程。因此,我们将使用完善的email软件包来节省一些时间,让我们专注于学习正则表达式。

我们还创建了一个空列表emails,用于存储字典。每本词典将包含每封电子邮件的详细信息。

现在,让我们开始应用正则表达式!

注意:为简洁起见,我们剪裁了上面的打印输出。如果您在自己的机器上打印此文件,它将显示其中包含的所有内容,contents而不是...像上面那样结束。

我们使用re模块的split函数将整个文本块分割fh为单独的电子邮件列表,然后将其分配给变量contents。这很重要,因为我们希望通过使用for循环遍历列表来逐一处理电子邮件。但是,我们如何知道按字符串分割"From r"?

我们之所以知道这一点,是因为在编写脚本之前我们已经查看了文件。我们不必细读其中的数千封电子邮件。只是前几个,看看数据的结构是什么样子。只要有可能,最好在开始使用代码之前先关注实际数据,因为您经常会发现诸如此类的有用功能。

我们已经截取了原始文本文件的屏幕截图:

电子邮件以“ From r”开头

绿色方框是第一封电子邮件。蓝色方框是第二封电子邮件。如我们所见,这两封电子邮件均以开头"From r",并以红色框突出显示。

我们在本教程中使用欺诈电子邮件语料库的原因之一是,当数据杂乱无章,不熟悉且没有文档时,我们不能仅仅依靠代码来整理数据。这将需要一双人眼。正如我们刚刚显示的,我们必须研究语料库本身以研究其结构。

像这样杂乱无章的数据可能需要大量清理。例如,即使我们使用本教程将要构建的完整脚本来计算此集合中的3977封电子邮件,但实际上还有更多。某些电子邮件实际上并不以开头"From r",因此不会单独计算。(不过,为了简洁起见,我们将继续处理该问题,并用分隔所有电子邮件"From r"。)

还要注意,我们contents.pop(0)用来摆脱列表中的第一个元素。这是因为"From r"字符串在第一封电子邮件之前。拆分该字符串后,它将在索引0处生成一个空字符串。我们将要编写的脚本是为电子邮件设计的。如果我们尝试在空字符串上使用它,则可能会引发错误。摆脱空字符串可以使我们避免破坏脚本。

使用For循环获取每个名称和地址

接下来,我们将使用contents列表中的电子邮件。

在上面的代码中,我们使用for循环来遍历,contents因此我们可以依次处理每封电子邮件。我们创建了一个词典,emails_dict其中包含每封电子邮件的所有详细信息,例如发件人的地址和姓名。实际上,这些是我们发现的第一批物品。

这是一个三步过程。首先从寻找From:领域开始。

在第1步中,我们From:使用re.search()函数查找整个字段。该.装置除了任何字符n,并且*其延伸到行的结尾。然后,我们将其分配给变量sender。

但是,数据并不总是那么简单。它可能包含惊喜。例如,如果没有From:字段怎么办?该脚本将引发错误并中断。我们在步骤2中避免了这种情况下的错误。

为了避免由于缺少From:字段而导致的错误,我们使用一条if语句来检查sendernot None。如果是,我们分配s_email和s_name的值,None以便脚本可以继续运行而不是意外中断。

如果您在自己的文件中使用本教程,则可能已经意识到使用正则表达式会变得混乱。例如,这些if-else语句是在编写主体时对主体使用反复试验的结果。编写代码是一个反复的过程。值得注意的是,即使本教程看起来很简单,实际实践也需要进行更多的实验。

在第2步中,我们使用之前的regex模式\w\S*@.*\w,该模式与电子邮件地址匹配。

我们将对名称使用其他策略。每个名称都由左侧:子字符串的冒号()"From:"和<右侧电子邮件地址的左尖括号()界定。因此,我们使用它:.*<来查找名称。我们摆脱:并<从每个结果的时刻。

现在,让我们打印出代码的结果以查看它们的外观。

同样,我们有匹配对象。每次我们将re.search()字符串应用于字符串时,都会生成匹配对象。我们必须将它们变成字符串对象。

我们这样做之前,记得,如果没有From:现场,sender将具有的价值None,因此也将s_email和s_name。因此,我们必须再次检查这种情况,以便脚本不会意外中断。让我们看看如何首先构建代码s_email。

在步骤3A中,我们使用一条if语句检查s_emailnot None,否则它将引发错误并破坏脚本。

然后,我们只需将s_emailmatch对象转换为字符串并将其分配给sender_email变量。我们将其添加到emails_dict字典中,这将使我们日后将细节转换为pandas数据框变得异常容易。

我们s_name在步骤3B中所做的几乎完全相同。

正如我们以前那样,我们首先检查s_name是不是None在步骤3B。

然后,在将字符串分配给变量之前,我们两次使用re模块的re.sub()函数。首先,我们删除冒号和它与名称之间的所有空白字符。我们:s*用一个空字符串代替""。然后,我们删除空格字符和名称另一边的尖括号,再次用空字符串替换它。最后,在将字符串分配给之后sender_name,我们将其添加到字典中。

让我们检查一下结果。

完善。我们已经隔离了电子邮件地址和发件人的姓名。我们还将它们添加到字典中,该字典将很快投入使用。

现在我们已经找到了发件人的电子邮件地址和名称,我们将执行完全相同的步骤来获取字典的收件人的电子邮件地址和名称。

首先,我们找到To:领域。

接下来,我们抢先在场景recipient是None。

如果recipient不是None,则用于re.search()查找包含电子邮件地址和收件人姓名的匹配对象。否则,我们传递r_email和r_name的值None。

然后,将匹配对象转换为字符串并将其添加到字典中。

由于From:和To:字段的结构相同,因此我们可以对两者使用相同的代码。我们需要为其他字段定制略有不同的代码。

获取电子邮件的日期

现在确定发送电子邮件的日期。

我们Date:为From:和To:字段获取具有相同代码的字段。

并且,就像我们对这两个字段所做的一样,我们检查Date:分配给date_field变量的字段是否不是None。

我们已经打印了出来,date_field.group()以便我们可以更清楚地看到字符串的结构。它包括日期,DD MMM YYYY格式的日期和时间。我们只想要日期。日期的代码与姓名和电子邮件地址基本相同,但更为简单。也许唯一令人困惑的是正则表达式模式\d+\s\w+\s\d+。

日期以数字开头。因此,我们用d它来解释它。但是,作为日期的DD部分,它可以是一位或两位数字。在这里+变得重要。在Python正则表达式中,+匹配其左侧1个或多个模式实例。d+因此,无论日期是DD还是一两位数字,它都将与日期的DD部分匹配。

在那之后,有一个空间。这是由占的s,它查找空白字符。因此,该月由三个字母组成w+。然后它撞到另一个空间s。年份由数字组成,因此我们d+再次使用。

完整模式\d+\s\w+\s\d+起作用的原因是它是一个精确的模式,在两侧均以空格字符为界。

接下来,我们None像以前一样检查值。

如果date不是None,则将其从匹配对象转换为字符串,并将其分配给变量date_sent。然后,将其插入字典中。

在继续之前,我们应该注意一个关键点。+并且*看起来相似,但它们可以产生非常不同的结果。让我们以日期字符串为例。

如果使用*,则将匹配零个或多个匹配项。+匹配一个或多个事件。我们已经打印了两种情况的结果。有很大的不同。如您所见,+获取完整日期,而*获取空格和数字31。

接下来,是电子邮件的主题行。

获取电子邮件主题

和以前一样,我们使用相同的代码和代码结构来获取所需的信息。

现在我们对Python正则表达式的使用越来越熟悉了,不是吗?它与以前的代码大致相同,不同之处在于,我们"Subject: "用空字符串代替仅获取主题本身。

获取电子邮件的正文

要插入字典的最后一项是电子邮件的正文。

将标头与电子邮件正文分开是一项非常复杂的任务,尤其是当许多标头以一种或另一种方式不同时。在原始的无组织数据中很少发现一致性。对我们来说幸运的是,这项工作已经完成。Python的email软件包非常擅长此任务。

请记住,我们已经较早导入了该软件包。现在,我们将其message_from_string()功能应用于item,以将完整的电子邮件转换为emailMessage对象。Message对象由标头和有效负载组成,它们分别对应于电子邮件的标头和正文。

接下来,我们将其get_payload()功能应用于Message对象。此功能隔离电子邮件的正文。我们将其分配给变量body,然后将其插入到emails_dict键下的字典中"email_body"。

为什么使用电子邮件软件包而不是正文

您可能会问,为什么使用emailPython软件包而不是regex?这是因为目前还没有很好的方法来处理Python正则表达式,而这不需要大量的清理工作。这意味着可能需要另外一份教程。

值得检查一下我们如何做出这样的决定。但是,我们需要先了解[ ]正则表达式中的方括号,然后才能这样做。

[ ]匹配放置在其中的任何字符。例如,如果我们要查找"a","b"或"c"字符串,则可以将其[abc]用作模式。我们上面讨论的模式也适用。[\w\s]会找到字母数字或空格字符。例外是.,它成为方括号内的文字周期。

现在,我们可以更好地了解我们是如何决定使用电子邮件软件包的。

窥视数据集可发现电子邮件标题在字符串"Status: 0"或处停止"Status: R0",并"From r"在下一封电子邮件的字符串前结束。因此,我们可以Status:\s*\w*\n*[\s\S]*From\sr*用来仅获取电子邮件正文。[\s\S]*适用于大块的文本,数字和标点符号,因为它可以搜索空白或非空白字符。

不幸的是,有些电子邮件包含多个"Status:"字符串,而另一些则不包含"From r",这意味着我们会将电子邮件拆分成多于或少于电子邮件列表中词典的数量。它们与我们已经拥有的其他类别不匹配。使用熊猫时,这会产生问题。因此,我们决定利用该email软件包。

创建词典列表

最后,将字典追加emails_dict到emails列表中:

我们可能要emails在此时打印列表以查看其外观。如果您只是一直在使用我们的小样本文件,那么这将是反高潮的,但是在整个语料库中,您将看到正则表达式的强大功能!

我们还可以print(len(emails_dict))查看列表中有多少个词典,因此还有电子邮件。如前所述,整个语料库包含3977。

这是完整的代码:

如果使用我们的示例文本文件运行它,将会得到以下结果:

我们已经打印出emails列表中的第一项,它显然是带有键和值对的字典。因为我们使用了for循环,所以每个字典都具有相同的键但值不同。

我们已替换为item,"email content here"以便我们不会打印出电子邮件的全部内容并阻塞屏幕。如果您要使用实际数据集在家打印此文件,则会看到整个电子邮件。

用熊猫处理数据

有了列表中的词典,我们使熊猫图书馆的工作变得无比轻松。每个键将成为列标题,每个值将成为该列中的一行。

我们要做的就是应用以下代码:

通过这一行,我们emails使用pandas DataFrame()函数将字典列表转换为数据框。我们也将其分配给变量。

而已。现在,我们有了一个复杂的熊猫数据框。这实际上是一个整洁的表格,其中包含我们从电子邮件中提取的所有信息。

让我们看一下前几行。

该dataframe.head()函数仅显示前几行,而不显示整个数据集。这需要一个论点。一个可选参数允许我们指定要显示多少行。在这里,n=3让我们查看三行。

我们还可以精确地找到我们想要的东西。例如,我们可以找到从特定域名发送的所有电子邮件。但是,让我们学习一种新的正则表达式模式,以提高找到所需项目的精度。

管道符号会|在其任一侧寻找字符。例如,a|b寻找a或b。

|可能看起来与相同[ ],但是它们确实有所不同。假设我们要匹配要么"crab","lobster"或"isopod"。大数据分析Python的正则表达式Regular Expressions使用方法https://www.aaa-cg.com.cn/data/2301.html使用crab|lobster|isopod会比有意义[crablobsterisopod],不是吗?前者将寻找每个单词,而后者将寻找每个字母。

现在,我们|来查找从一个或另一个域名发送的所有电子邮件。

我们在这里使用了相当长的代码。让我们从内而外开始。

emails_df['sender_email']选择标记为的列sender_email。接下来,str.contains(epatra|spinfinder)返回True是否在该列中找到子字符串"epatra"或"spinfinder"。最后,外部emails_df[]返回行的视图,其中该sender_email列包含目标子字符串。好漂亮!

我们也可以查看来自各个单元的电子邮件。为此,我们经历了四个步骤。在步骤1中,我们找到"sender_email"列包含字符串的行的索引"@spinfinder"。注意我们如何使用正则表达式来执行此操作。

在步骤2中,我们使用索引查找电子邮件地址,该loc[]方法作为具有多个不同属性的Series对象返回该电子邮件地址。我们在下面将其打印出来以查看其外观。

在第3步中,我们从系列对象中提取电子邮件地址,就像从列表中提取项目一样。您可以看到它的类型现在是class。

步骤4是提取电子邮件正文的位置。

在步骤4中,emails_df['sender_email'] == "bensul2004nng@spinfinder.com"找到该sender_email列包含value 的行"bensul2004nng@spinfinder.com"。接下来,['email_body'].values查找email_body同一行中的列的值。最后,我们打印出该值。

如您所见,我们可以通过多种方式使用正则表达式,它也可以与大熊猫一起使用!如果您的正则表达式工作包含大量的反复试验,请不要气,,尤其是在您刚刚入门时!

其他资源

自从几年前正则表达式从生物学跃升为工程学以来,正则表达式已取得了巨大的发展。如今,正则表达式已在不同的编程语言中使用,其中除了其基本模式之外还有一些变体。我们已经学习了很多Python正则表达式,并且如果您想将它提高到一个新的水平,那么我们的Python数据清理高级课程可能是一个不错的选择。

您还可以在官方参考资料中找到一些帮助,例如Python 有关其模块的文档re。Google有更快的参考资料。

如果您愿意,也可以开始探索Python regex与其他形式的regex Stack Overflow帖子之间的区别。

如果您需要数据集进行试验,则Kaggle和StatsModels很有用。

最后,这是我们制作的Regex速查表,它也非常有用。

https://www.toutiao.com/i6829923957647344142/

发表评论

快捷回复: 表情:
AddoilApplauseBadlaughBombCoffeeFabulousFacepalmFecesFrownHeyhaInsidiousKeepFightingNoProbPigHeadShockedSinistersmileSlapSocialSweatTolaughWatermelonWittyWowYeahYellowdog
评论列表 (暂无评论,105人围观)

还没有评论,来说两句吧...