使用pandas和Python 3 操作和分析数据

介绍

Python pandas包用于数据操作和分析,旨在让您以直观的方式使用带标签或关系数据。 pandas包提供了电子表格功能,但是因为你使用Python,它比传统的图形电子表格程序更快,更高效。 在本教程中,我们将讨论如何设置大型数据集, pivot_table()groupby()pivot_table()函数,以及如何可视化数据。 为了对pandas包有一些熟悉,你可以阅读我们的教程 “pandas包简介”及其在Python 3中的数据结构

先决条件

本指南将介绍如何在本地桌面或远程服务器上使用 pandas中的数据。 使用大型数据集可能需要大量内存,因此在任一情况下,计算机将需要至少 2GB的内存来执行本指南中的一些计算。 在本教程中,我们将使用 Jupyter Notebook来处理数据。 如果你还没有,你应该按照我们的 教程安装和设置Jupyter Notebook for Python 3

设置数据

在本教程中,我们将使用美国社会保障局的数据,这些数据来自 社会安全网站的8MB压缩文件。 让我们在 本地机器或我们的 服务器上从正确的目录激活我们的Python 3编程环境:
cd environments
. my_env/bin/activate
现在让我们为我们的项目创建一个新的目录。我们可以调用它的 names ,然后移动到目录:
mkdir names
cd names
在此目录中,我们可以使用 curl命令从社会安全网站拉取zip文件:
curl -O https://www.ssa.gov/oact/babynames/names.zip
下载文件后,让我们验证我们是否安装了我们将要使用的所有软件包:
  • numpy以支持多维数组
  • matplotlib来可视化数据
  • pandas为我们的数据分析
  • 使我们的matplotlib统计图形更美观
如果您没有安装任何软件包,请使用 pip安装它们,如:
pip install pandas
pip install matplotlib
pip install seaborn
如果你还没有安装 numpy软件包。 现在我们可以启动Jupyter Notebook:
jupyter notebook
在Jupyter Notebook的Web界面上,您将看到 names.zip文件。 要创建新的笔记本文件,请从右上角的下拉菜单中选择 新建 > Python 3创建一个新的Python 3笔记本 这将打开一个笔记本。 让我们从导入我们将要使用的包开始。在我们的笔记本顶部,我们应该写下面的内容:
import numpy as np
import matplotlib.pyplot as pp
import pandas as pd
import seaborn
我们可以运行这个代码,并通过键入 ALT + ENTER移动到一个新的代码块。 让我们告诉Python Notebook要保持我们的图表内联:
matplotlib inline
让我们运行代码,然后键入 ALT + ENTER继续。 从这里,我们将继续解压缩zip存档,将CSV数据集加载到pandas中,然后连接 pandas DataFrames

解压缩Zip存档

要将zip存档解压缩到当前目录中,我们将导入zipfile模块,然后使用文件名称(在我们的示例中为 names.zip )调用 ZipFile函数:
import zipfile
zipfile.ZipFile('names.zip').extractall('.')
我们可以运行代码,然后键入 ALT + ENTER继续。 现在,如果你回顾你的 names目录,你将有 .txt文件的名称数据CSV格式。 这些文件将与文件中的数据年份(1881年到2015年)相对应。这些文件中的每一个遵循类似的命名约定。 例如,2015文件称为 yob2015.txt ,而1927文件称为 yob1927.txt 。 要查看其中一个文件的格式,让我们使用Python打开一个并显示前5行:
open('yob2015.txt','r').readlines()[:5]
运行代码,然后继续执行 ALT + ENTER
Output['Emma,F,20355\n',
 'Olivia,F,19553\n',
 'Sophia,F,17327\n',
 'Ava,F,16286\n',
 'Isabella,F,15504\n']
数据格式化的方式是名称第一(如在 EmmaOlivia ),性别下一个(如女性名字的 F和男性名字的 M ),然后与那个年份出生的婴儿的数量(有20,355婴儿命名艾玛谁出生于2015年)。 有了这些信息,我们可以将数据加载到 pandas

将CSV数据加载到pandas

要将逗号分隔的值数据加载到pandas中,我们将使用 pd.read_csv()函数,传递文本文件的名称以及我们决定的列名称。 我们将它赋给一个变量,在这种情况下是 names2015因为我们使用的是2015年出生文件的数据。
names2015 = pd.read_csv('yob2015.txt', names = ['Name', 'Sex', 'Babies'])
键入 ALT + ENTER运行代码并继续。 为了确保这一点,我们显示表的顶部:
names2015.head()
当我们运行代码并继续使用 ALT + ENTER时,我们将看到如下所示的输出: names2015.head输出 我们的表格现在有列出的姓名,性别和出生的婴儿的数字的信息。

连接pandas对象

连接pandas对象将允许我们使用 names目录中的所有单独的文本文件。 为了连接这些,我们首先需要通过将一个变量赋给一个未填充的 列表数据类型来初始化一个列表:
all_years = []
一旦我们这样做,我们将使用一个 for循环遍历所有的文件按年,范围从1880-2015。 我们将在2015年底添加 +1 ,以便2015年包含在循环中。
all_years = []

for year in range(1880, 2015+1):
在循环中,我们将在列表中添加每个文本文件值,使用 字符串格式化程序来处理每个文件的不同名称。 我们将这些值传递给 year变量。 再次,我们将指定 NameSexBabies数量的列:
all_years = []

for year in range(1880, 2015+1):
    all_years.append(pd.read_csv('yob{}.txt'.format(year),
                                 names = ['Name', 'Sex', 'Babies']))
此外,我们将为每个年份创建一个列,以保留这些订单。这样我们可以在每次迭代之后使用 -1的索引指向它们随着循环的进行。
all_years = []

for year in range(1880, 2015+1):
    all_years.append(pd.read_csv('yob{}.txt'.format(year),
                                 names = ['Name', 'Sex', 'Babies']))
    all_years[-1]['Year'] = year
最后,我们将使用 pd.concat()函数将它添加到pandas对象并进行 pd.concat() 。 我们将使用变量 all_names来存储这些信息。
all_years = []

for year in range(1880, 2015+1):
    all_years.append(pd.read_csv('yob{}.txt'.format(year),
                                 names = ['Name', 'Sex', 'Babies']))
    all_years[-1]['Year'] = year

all_names = pd.concat(all_years)
我们现在可以使用 ALT + ENTER运行循环,然后通过调用结果表的尾部(最底部的行)来检查输出:
all_names.tail()
all_names.tail outputl 我们的数据集现已完成,并准备在pandas中使用它进行额外的工作。

分组数据

使用 .groupby()您可以使用 .groupby()函数按列分组数据。 使用我们的 all_names变量作为完整的数据集,我们可以使用 groupby()将数据拆分为不同的桶。 让我们按性别和年份对数据集进行分组。我们可以这样设置:
group_name = all_names.groupby(['Sex', 'Year'])
我们可以运行代码并继续使用 ALT + ENTER 。 在这一点上,如果我们只调用 group_name变量,我们将得到这个输出:
Output<pandas.core.groupby.DataFrameGroupBy object at 0x1187b82e8>
这告诉我们它是一个 DataFrameGroupBy对象。此对象具有如何对数据进行分组的说明,但不提供有关如何显示值的说明。 要显示值,我们需要给出说明。我们可以计算 .size() .mean().sum() ,例如,返回一个表。 让我们从 .size()开始:
group_name.size()
当我们运行代码并继续使用 ALT + ENTER ,我们的输出将如下所示:
OutputSex  Year
F    1880      942
     1881      938
     1882     1028
     1883     1054
     1884     1172
...
这个数据看起来不错,但它可以更可读。我们可以通过附加 .unstack函数使其更具可读性:
group_name.size().unstack()
现在,当我们运行代码并继续输入 ALT + ENTER ,输出如下所示: group_name.size()。unstack()输出 这些数据告诉我们每年有多少女性和男性的名字。例如,在1889年,有1,479个女性名字和1,111个男性名字。 2015年有18,993名女性名字和13,959名男性名字。这表明,随着时间的推移,名称有更大的多样性。 如果我们想得到出生的婴儿的总数,我们可以使用 .sum()函数。 让我们将它应用于一个较小的数据集,从我们之前创建的单个 yob2015.txt文件中设置 yob2015.txt
names2015.groupby(['Sex']).sum()
让我们输入 ALT + ENTER运行代码,然后继续: names2015.groupby(['Sex'])。sum()输出 这显示了2015年出生的男性和女性婴儿的总数,但只有那些至少5年使用名字的婴儿才被计入数据集。 .groupby()函数允许我们将数据分成有意义的组。

数据透视表

数据透视表对于汇总数据很有用。它们可以自动对存储在一个表中的数据进行排序,计数,总计或平均。然后,他们可以在汇总数据的新表中显示这些操作的结果。 在 pivot_table()pivot_table()函数用于创建数据透视表。 要构建数据透视表,我们首先调用要使用的DataFrame,然后调用要显示的数据,以及如何对它们进行分组。 在这个例子中,我们将使用 all_names数据,并在一个维度中显示按名称分组的婴儿数据,在另一个维度中显示年份:
pd.pivot_table(all_names, 'Babies', 'Name', 'Year')
当我们键入 ALT + ENTER运行代码并继续时,我们将看到以下输出: pd.pivot_table(all_names,'Babies','Name','Year')输出 因为这显示了很多空值,我们可能希望将Name和Year保持为列,而不是一个行中的行,另一个中的列。我们可以通过将数据分组在方括号中来实现:
pd.pivot_table(all_names, 'Babies', ['Name', 'Year'])
一旦我们键入 ALT + ENTER运行代码并继续,此表现在将只显示每个名称的记录数据:
OutputName       Year
Aaban      2007     5.0
           2009     6.0
           2010     9.0
           2011    11.0
           2012    11.0
           2013    14.0
           2014    16.0
           2015    15.0
Aabha      2011     7.0
           2012     5.0
           2014     9.0
           2015     7.0
Aabid      2003     5.0
Aabriella  2008     5.0
           2014     5.0
           2015     5.0
此外,我们可以将数据分组为“名称和性别”为一个维度,“年份”为另一个维度,如:
pd.pivot_table(all_names, 'Babies', ['Name', 'Sex'], 'Year')
当我们运行代码并继续使用 ALT + ENTER时,我们将看到下表: pd.pivot_table(all_names,'Babies',['Name','Sex'],'Year')output 数据透视表允许我们从现有的表中创建新的表,使我们能够决定如何分组数据。

可视化数据

通过使用与其他包如 matplotlib pandas ,我们可以在我们的笔记本中可视化数据。 我们将可视化关于多年来给定名称的受欢迎程度的数据。为了做到这一点,我们需要设置和排序索引以重做数据,这将允许我们看到特定名称的变化的流行度。 pandas包允许我们执行层次或多级索引,这使我们能够以任意数量的维存储和操作数据。 我们将索引数据与性别,然后名称,然后年度的信息。我们还要对索引进行排序:
all_names_index = all_names.set_index(['Sex','Name','Year']).sort_index()
键入 ALT + ENTER运行并继续到我们的下一行,我们将让笔记本显示新的索引DataFrame:
all_names_index
运行代码并继续执行 ALT + ENTER ,输出将如下所示: all_names_index输出 接下来,我们要编写一个函数来绘制一个名字的流行度。我们将调用函数 name_plot并传递 sexname作为它的参数,当我们运行该函数时,我们将调用它。
def name_plot(sex, name):
我们现在将设置一个称为 data的变量来保存我们创建的表。 我们还将使用pandas DataFrame loc ,以便通过索引的值选择我们的行。 在我们的例子中,我们需要 loc基于MultiIndex中的字段组合,指的是 sexname数据。 让我们把这个结构写入我们的函数:
def name_plot(sex, name):
    data = all_names_index.loc[sex, name]
最后,我们要绘制 matplotlib.pyplot的值,我们导入为 pp 。然后,我们将绘制性别和姓名数据的值与索引的关系,对于我们的目的,它是年。
def name_plot(sex, name):
    data = all_names_index.loc[sex, name]

    pp.plot(data.index, data.values)
键入 ALT + ENTER运行并移动到下一个单元格。 我们现在可以调用具有我们选择的性别和名称的函数,例如对于具有给定名字 Danica女性名字的 F
name_plot('F', 'Danica')
当您现在键入 ALT + ENTER时,您将收到以下输出: Danica名称绘图输出 请注意,根据您使用的系统,您可能会对字体替换有警告,但数据仍然会正确绘制。 看看可视化,我们可以看到女性名字Danica在1990年左右的人气小幅上升,并在2010年之前达到顶峰。 我们创建的函数可以用于绘制来自多个名称的数据,以便我们可以看到不同名称随时间的趋势。 让我们开始让我们的情节有点大:
pp.figure(figsize = (18, 8))
接下来,让我们创建一个包含所有想要绘制的名称的列表:
pp.figure(figsize = (18, 8))

names = ['Sammy', 'Jesse', 'Drew', 'Jamie']
现在,我们可以使用 for循环遍历列表,并绘制每个名称的数据。首先,我们将尝试这些性别中性名称作为女性名称:
pp.figure(figsize = (18, 8))

names = ['Sammy', 'Jesse', 'Drew', 'Jamie']

for name in names:
    name_plot('F', name)
为了使这些数据更容易理解,让我们包括一个图例:
pp.figure(figsize = (18, 8))

names = ['Sammy', 'Jesse', 'Drew', 'Jamie']

for name in names:
    name_plot('F', name)

pp.legend(names)
我们将键入 ALT + ENTER运行代码并继续,然后我们将收到以下输出: 名称图,女性姓名输出 虽然每个名字一直在慢慢地成为女性名流,但杰米在1980年代以女性名字而闻名。 让我们画出相同的名字,但这次是男名字:
pp.figure(figsize = (18, 8))

names = ['Sammy', 'Jesse', 'Drew', 'Jamie']

for name in names:
    name_plot('M', name)

pp.legend(names)
再次,键入 ALT + ENTER运行代码并继续。图形将如下所示: 名称图,男性名输出 这些数据表明,不同的名字更受欢迎,Jesse一般是最受欢迎的选择,在20世纪80年代和90年代特别受欢迎。 从这里,您可以继续播放名称数据,创建关于不同名称及其受欢迎程度的可视化,并创建其他脚本以查看不同的数据以进行可视化。

结论

本教程介绍了如何使用大数据集从设置数据,使用 groupby()pivot_table()分组数据,使用 pivot_table()索引数据,以及使用 matplotlibmatplotlib数据。 许多组织和机构提供数据集,您可以使用它们继续了解 pandas和数据可视化。 例如,美国政府通过 data.gov提供数据。 您可以通过matplotlib了解更多关于可视化数据的 matplotlib ,请参考 如何在Python中绘制数据的指南 3使用matplotlib如何图形的字频率使用matplotlib和Python 3
赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏