第十三章 pandas官方文档0.22中文教程---Tutorials(lessons 2 ),个人渣翻译

这里写图片描述
####Lesson 2 从TXT文件读取 -导出到TXT -选择顶部/底部记录-描述性统计-分组/排序数据

我们首先创建我们自己的数据集进行分析。这将让用户无障碍阅读本教程,而不需要下载任何文件来复制下面的结果。我们将把这个数据集导出到一个文本文件中,这样您就可以从文本文件中获取一些数据。

我们将学习如何在包含婴儿名字的文本文件中读取数据。数据包括出生在1880年的婴儿名字。

在这里,我们将简单地查看数据并确保它是干净的。我的意思是,我们将查看文本文件的内容并查找任何异常。这些数据可能包括丢失的数据、数据的不一致或其他看起来不合适的数据。如果找到了,我们就必须决定如何处理这些记录。

我们会在特定的年份找到最流行的名字。
通过表格数据和图表,清楚地向终端用户显示特定年份中最流行的名称。.
注意:
确保你已经看过了之前所有的课程,因为在之前的课程中所学到的知识是这个练习所需要的。

import pandas as pd
from numpy import random

数据集将包括1000个婴儿名字和那一年(1880年)的出生人数。我们还会增加大量的重复,这样你会看到同一个婴儿的名字不止一次。你可以想到每个名字的多重条目只是在全国各地不同的医院报告每个婴儿名字的出生数量。因此,如果两家医院报告婴儿名字“Bob”,数据将有两个值,名称为Bob。我们将从创建随机的婴儿名开始。

names = ['Bob','Jessica','Mary','John','Mel']

用上面的五种方法随机列出1000个宝宝的名字,我们将会做以下的事情:
在0和4之间生成一个随机数
为此,我们将使用函数seed, randint, len, range和zip
seed(500) – 创建种子
randint(low=0,high=len(name)) --在0和列表的长度之间生成一个随机整数。
names[n] – 选择其索引为n的名称
for i in range(n) 循环n次, i.e. 0, 1,2,3,…n
random_names =从名称列表中选择一个随机名称,并执行n次

random.seed(500)
random_names = [names[random.randint(low=0,high=len(names))] for i in range(1000)]

# Print first 10 records
random_names[:10]

(for i in range(1000) 一行写完,是列表循环表达式,整条语句表明每次随机从names列表中选取一个姓名,再添加进random_names 列表,循环1000次)
(python可以通过range函数生成范围整数,但不能直接生成范围型字符,例子的方式就变相生成了范围字符串)
这里写图片描述

births = [random.randint(low=0,high=1000) for i in range(1000)]
births[:10]

(生成0到1000的随机数,总共1000个,放进births列表)
这里写图片描述
使用zip函数合并名称和出生数据集。

BabyDataSet = list(zip(random_names,births))
BabyDataSet[:10]

这里写图片描述
我们基本上完成了创建数据集的工作。现在我们将使用pandas库将这些数据导出到一个csv文件中。
df将是一个DataFrame对象。您可以认为该对象以类似于sql表或excel电子表格的格式保存BabyDataSet的内容。让我们看一下df里面的内容。

df = pd.DataFrame(data = BabyDataSet, columns=['Names', 'Births'])
df[:10]

这里写图片描述
将dataframe导出到文本文件。我们可以命名文件births1880.txt。函数to_csv将用于导出。除非另有说明,否则文件将保存在notebook的同一位置。
我们将使用的唯一参数是索引和标头。将这些参数设置为False将防止索引和标题名称被导出。更改这些参数的值,以便更好地理解它们的使用。

df.to_csv('births1880.txt',index=False,header=False)

为了读取文本文件,我们将使用pandas函数read_csv。让我们来看看这个函数以及它所需要的输入。

df = pd.read_csv('births1880.txt')

(这部分内容和Lessons 1 相同,注意写入的时候没有指定列索引和行索引,因此直接读取后数据的格式有点问题)

df.info()

这里写图片描述
(新学函数info,可以统计整个df结构的信息)
Info 告诉我们:
①数据集中有999个记录。
②有一个名为Mary的列有999个值。
③有一个列,名为968,有999个值。
④在这两列中,一个是数字的,另一个是非数字的。
要实际查看dataframe的内容,我们可以使用head()函数,默认情况下将返回前5个记录。您也可以通过一个数字n来返回dataframe的top n记录。

df.head()

这里写图片描述
这就引出了我们的第一个问题。read_csv函数将文本文件中的第一个记录作为标题名称处理。这显然是不正确的,因为文本文件没有向我们提供标题名称。

df = pd.read_csv('births1880.txt', names=['Names','Births'])
df.head(5)

这里写图片描述
你可以想到数字[0,1,2,3,4,…]作为Excel文件中的行号。在pandas中,这些是dataframe索引的一部分。您可以将索引视为sql表的主键,但允许索引具有重复的异常。

我们的数据包括婴儿名字和1880年出生的人数。我们已经知道我们有1,000条记录,并且没有记录丢失(非空值)。我们可以验证“Names”列仍然只有五个惟一的名称。
我们可以使用dataframe的惟一属性来查找“Names”列的所有惟一记录。

df['Names'].unique()

这里写图片描述
(函数unique可以剔除重复的值,只显示出不同的部分,它只能用在某列或者某行,不能用在整个df结构上)
如果你想打印这些唯一的值

for x in df['Names'].unique():
    print(x)

(假如对整个df结构使用for x in会发生什么?会输出每一行的内容么?)
(for x in df: print(x)
这里写图片描述
实测仅仅输出列名)

另一种办法就是使用describe函数:

print(df['Names'].describe())

这里写图片描述
(describe函数既能用在行列,又能用在整个df结构上,它就是个统计,只能看出unique有5个,具体是哪5个就不清楚了,而且看top是bob,就知道临时进行了排序)

由于每个婴儿名有多个值,所以我们需要聚合这些数据,因此只能出现一个婴儿名。这意味着1000行需要变成5行。我们可以通过使用groupby函数来实现这一点。

name = df.groupby('Names')
df = name.sum()
df

这里写图片描述
为了找到最流行的名字或婴儿名字,我们可以做以下其中的一项。
①对dataframe进行排序并选择第一行。
②使用max()属性来找到最大值。

# Method 1:方法1
Sorted = df.sort_values(['Births'], ascending=False)
Sorted.head(1)
# Method 2:方法2
df['Births'].max()

在这里,我们可以绘制出“births”栏,并在图表上标注“终端用户”。与表格一起,终端用户有一个清晰的图片,Bob是数据集中最受欢迎的婴儿名。

# Create graph
df['Births'].plot.bar()

print("The most popular name")
df.sort_values(by='Births', ascending=False)

这里写图片描述
(plot新写法.plot.bar(),lesson 1使用的是.plot(kind=‘bar’),而且画图语句plot在前,print语句在后,结果却是图片最后给出,不知道是不是IPython特有)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值