创建数据- 首先创建自己的数据集进行分析。这可以防止阅读本教程的用户下载任何文件以复制下面的结果。我们将此数据集导出到文本文件,以便您可以获得的一些从csv文件中提取数据的经验
获取数据- 学习如何读取csv文件。数据包括婴儿姓名和1880年出生的婴儿姓名数量。
准备数据- 在这里,我们将简单地查看数据并确保它是干净的。干净的意思是我们将查看csv的内容并查找任何异常。这些可能包括缺少数据,数据不一致或任何其他看似不合适的数据。如果发现任何问题,我们将不得不决定如何处理这些记录。
分析数据- 我们将简单地找到特定年份中最受欢迎的名称。
现有数据- 通过表格数据和图表,清楚地向最终用户显示特定年份中最受欢迎的姓名。
#导入本教程所需的所有库#导入库中特定函数的一般语法:## from(library)import(特定库函数)from pandas import DataFrame , read_csvimport matplotlib.pyplot as pltimport pandas as pdimport sysimport matplotlib#输出Python Pandas Matplotlib 版本print('Python version ' + sys.version)print('Pandas version ' + pd.__version__)print('Matplotlib version ' + matplotlib.__version__)#Python version 3.6.5 |Anaconda, Inc.| (default, Apr 26 2018, 08:42:37) #[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)]#Pandas version 0.23.0#Matplotlib version 2.2.2
创建数据
该数据集将包括5个婴儿名称和该年度记录的出生人数(1880年)。
# The inital set of baby names and bith ratesnames = ['Bob','Jessica','Mary','John','Mel']births = [968, 155, 77, 578, 973]
要将这两个列表合并在一起,我们将使用zip函数。
zip?
BabyDataSet = list(zip(names,births))BabyDataSetout[1]:[('Bob', 968), ('Jessica', 155), ('Mary', 77), ('John', 578), ('Mel', 973)]
我们基本上完成了数据集的创建。现在将使用pandas库将此数据集导出到csv文件中。
df将是一个DataFrame对象。可以将此对象视为类似于sql表或excel电子表格的格式保存BabyDataSet的内容。让我们来看看df里面的内容。
df = pd.DataFrame(data = BabyDataSet, columns=['Names', 'Births'])dfOut[1]: Names Births0 Bob 9681 Jessica 1552 Mary 773 John 5784 Mel 973
将dataframe导出为csv文件。可以将文件命名为births1880.csv。函数to_csv将用于导出文件。除非另有指明,否则文件将保存在运行环境下的相同位置。
df.to_csv?
我们将使用的唯一参数是索引和标头。将这些参数设置为False将阻止导出索引和标头名称。更改这些参数的值以更好地了解它们的用法。
df.to_csv('births1880.csv',index=False,header=False)
获取数据
要导入csv文件,我们将使用pandas函数read_csv。我们来看看这个函数以及它需要什么输入。
read_csv?
即使这个函数有很多参数,我们也只是将它传递给文本文件的位置。
Location = /Users/mac/Desktop/births1880.csv
注意:根据文件保存在电脑的位置,您可能需要修改上面的位置。
Location = '/Users/mac/Desktop/births1880.csv'df = pd.read_csv(Location)dfOut[1]: Bob 9680 Jessica 1551 Mary 772 John 5783 Mel 973
这就把我们带到了练习的第一个问题。read_csv处理的第一个记录在CSV文件中为头名。这显然是不正确的,因为csv文件没有为我们提供标题名称。
为了纠正这个问题,我们将header参数传递给read_csv函数并将其设置为None(在python中表示null)
df = pd.read_csv(Location, header=None)dfOut[1]: 0 10 Bob 9681 Jessica 1552 Mary 773 John 5784 Mel 973
如果我们想给列特定的名称,可以通过传递另一个名为name的参数。此时也可以省略header参数。
df = pd.read_csv(Location, names=['Names','Births'])dfOut[1]: Names Births0 Bob 9681 Jessica 1552 Mary 773 John 5784 Mel 973
您可以将数字[0,1,2,3,4]视为Excel文件中的行号。在pandas中,这些是dataframe索引的一部分。您可以将索引视为sql表的主键,但允许索引具有重复项。
[Names,Births]可以作为列标题,类似于Excel电子表格或sql数据库中的列标题。
#删除csv文件import osos.remove(Location)
准备数据
我们的数据包括婴儿的名字和1880年的出生人数。我们已经知道我们有5条记录而且没有任何记录丢失(非空值)。
此时的名称列无关紧要,因为它很可能只是由字母数字字符串(婴儿名称)组成。本专栏中可能存在不良数据,但在此分析时我们不会担心这一点。在出生栏应该只包含代表出生在一个特定年份具有特定名称的婴儿数目的整数。我们可以检查所有数据是否都是数据类型整数。将此列的数据类型设置为float是没有意义的。在此分析中,我不担心任何可能的异常值。 要意识到除了我们在“名称”列中所做的检查之外,简要地查看数据框内的数据应该是我们在游戏的这个阶段所需要的。随着我们在数据分析生命周期中的继续,我们将有很多机会找到数据集的任何问题。
# 检查数据列的类型df.dtypesOut[1]: Names objectBirths int64dtype: object#检查Births列df.Births.dtypeOut[1]: dtype('int64')
如您所见,Births列的类型为int64,因此此列中不会出现浮点数(十进制数字)或字母数字字符。
分析数据
要找到最受欢迎的姓名或婴儿出生率最高的名字,我们可以执行以下操作之一。
对数据框进行排序并选择顶行
使用max()属性查找最大值
# Method 1:Sorted = df.sort_values(['Births'], ascending=False)Sorted.head(1)Out[1]: Names Births4 Mel 973# Method 2:df['Births'].max()Out[1]: Names Births4 Mel 973
数据可视化
在这里,我们可以绘制出生者列并标记图表以向最终用户显示图表上的最高点。与该表一起,最终用户清楚地了解Mel是数据集中最受欢迎的婴儿名称。plot()是一个方便的属性,pandas可以让您轻松地在数据框中绘制数据。我们学习了如何在上一节中找到Births列的最大值。现在找到973值的实际宝贝名称看起来有点棘手,所以让我们来看看吧。
解释一下:df ['Names']- 这是婴儿名字的整个列表,整个名字栏
df ['Births']- 这是1880年的整个出生列表,整个出生列
df['Births'].max()- 这是Births列中的最大值 [df['Births'] == df['Births'].max()]等于[查找出生列中等于973的所有记录]
df ['Names'] [df [' Births'] == df ['Births'].max()]等于选择Names列WHERE[Births列等于973]中的所有记录 另一种方法可能是使用Sorteddataframe: Sorted ['Names'].head(1).value
在STR()函数简单地将对象转换成一个字符串。
#创建图表df['Births'].plot()#数据集中的最大值MaxValue = df['Births'].max()#与最大值相关联的名称MaxName = df['Names'][df['Births'] == df['Births'].max()].values#文本显示在图形上Text = str(MaxValue) + " - " + MaxName#将文字添加到图表plt.annotate(Text, xy=(1, MaxValue), xytext=(8, 0), xycoords=('axes fraction', 'data'), textcoords='offset points')print("The most popular name")df[df['Births'] == df['Births'].max()]#也可以使用Sorted.head(1) The most popular nameOut[19]: Names Births4 Mel 973
为获取更好的阅读效果,请关注知乎专栏:小草学python
领取专属 10元无门槛券
私享最新 技术干货