第二课 TXT读取 - 导出 - 选择顶部/底部记录 - 描述性统计 - 分组/排序

第2课

创建数据 - 我们从创建自己的数据集开始分析。这可以防止阅读本教程的最终用户为得到下面的结果而不得不下载许多文件。我们将把这个数据集导出到一个文本文件中,这样您就可以获得从文本文件中一些拉取数据的经验。

获取数据 - 我们将学习如何阅读文本文件。这些数据包括婴儿的姓名和1880年出生的婴儿的数量。
准备数据 - 在这里,我们将简单地看一下数据并确保它是干净的。干净,我的意思是我们会看看文本文件的内容并发现任何异常。可能包括缺失的数据,数据中的不一致或任何其他不合适的数据。如果发现这些问题,我们将不得不决定如何处理这些记录。
分析数据 - 我们将简单地找出特定年份中流行的取名倾向。
呈现数据 - 通过表格数据和图表,清楚地向最终用户显示特定年份中最受欢迎的取名。

注意:
确保你已经浏览了以前的所有课程,因为以前课程中学到的知识将用于此练习。

pandas库用于所有数据分析,不包括一小部分的数据呈现部分。 数据呈现部分需要引入 matplotlib 库。导入库是我们在本课中采取的第一步。

In [1]:
#导入本教程所需的所有库
 import matplotlib.pyplot as plt
import pandas as pd
import sys
import matplotlib
from numpy import random
In[2]:
 print('Python version ' + sys.version)
print('Pandas version ' + pd.__version__)
print('Matplotlib version ' + matplotlib.__version__)
out[2]:
Python version 3.5.1 |Anaconda custom (64-bit)| (default, Feb 16 2016, 09:49:46) [MSC v.1900 64 bit (AMD64)]
Pandas version 0.20.1
Matplotlib version 1.5.1

 

 

创建数据 

数据集将包括1,000个宝宝的名字和当年记录的出生人数(1880年)。我们还将添加大量重复项目,以便您多次看到相同的宝贝名称。您可以考虑为每个姓名提供多个条目,简单地说就是全国各地的不同医院报告每个婴儿名称的分娩数量。因此,如果两家医院报告了宝宝名称“Bob”,则数据将具有两个名称Bob的值。我们将首先创建一组随机的宝宝名字。

在[3]中:
#婴儿名字的初始化
names =  [ 'Bob' 'Jessica' 'Mary' 'John' 'Mel' ] 

要使用上述五个随机列表中的1,000个婴儿名称,我们将执行以下操作:

  • 生成0到4之间的随机数

为此,我们将使用函数seedrandintlenrangezip

In [4]:
random.seed?
In [5]:
random.randint?
In [6]:
len?
In [7]:
range?
In [8]:
zip? 

seed(500) - 创建种子

randint(low=0,high=len(names)) - 生成一个介于0和列表“names”长度之间的随机整数.

names[n] - 选择其索引等于n的名称。.

for i in range(n) - 循环直到 i 等于n,即1,2,3,... n。

random_names = 从名称列表中选择一个随机名并执行此操作n次。

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

# 输出前10条记录
random_names[:10]
Out[9]:
['Mary',
 'Jessica',
 'Jessica',
 'Bob',
 'Jessica',
 'Jessica',
 'Jessica',
 'Mary',
 'Mary',
 'Mary']
 

生成0到1000之间的随机数字

In [10]:
births = [random.randint(low=0,high=1000) for i in range(1000)]
births[:10]
Out[10]:
[968, 155, 77, 578, 973, 124, 155, 403, 199, 191]
 

使用zip函数合并 names 和 births 数据集

In [11]:
BabyDataSet = list(zip(random_names,births))
BabyDataSet[:10]
Out[11]:
[('Mary', 968),
 ('Jessica', 155),
 ('Jessica', 77),
 ('Bob', 578),
 ('Jessica', 973),
 ('Jessica', 124),
 ('Jessica', 155),
 ('Mary', 403),
 ('Mary', 199),
 ('Mary', 191)]
 

我们基本上完成了创建数据集。我们现在将使用 pandas  库将此数据集导出到csv文件中

df  是一个  DataFrame  对象。您可以将此对象视为类似于SQL表或Excel电子表格的格式保存了BabyDataSet的内容。下面让我们看看df的内容  。

In [12]:
df = pd.DataFrame(data = BabyDataSet, columns=['Names', 'Births'])
df[:10]
Out[12]:
 NamesBirths
0 Mary 968
1 Jessica 155
2 Jessica 77
3 Bob 578
4 Jessica 973
5 Jessica 124
6 Jessica 155
7 Mary 403
8 Mary 199
9 Mary 191
 
  • 将这个数据帧导出到  csv  文件。我们可以命名为文件  births1880.txt。函数  to_csv  用于导出文件。除非另有说明,否则该文件将保存在当前目录下。
In [13]:
df.to_csv?
 

我们仅使用的参数是  index  和  header。将这些参数设置为False将会阻止导出索引和标题名称。更改这些参数的值以更好地了解它们的用法。

In [14]:
df.to_csv('births1880.txt',index=False,header=False)
 

获取数据 

要读入 txt 文件,我们将使用pandas函数  read_csv。让我们看看这个函数如何使用。

In [15]:
pd.read_csv?
 

虽然这个函数有很多参数,我们这里只简单地传递文本文件的位置。

文件位置在 C:\Users\ENTER_USER_NAME.xy\startups\births1880.txt

Note: 当然,你存放的文件位置不一样,你就需要修改它

In [16]:
Location = r'C:\Users\david\notebooks\update\births1880.txt'
df = pd.read_csv(Location)
 

注意字符串前面的r。由于斜线"\"是特殊转义字符,因此在字符串前加一个  r  将会忽略整个字符串的转义。

In [17]:
df.info()
 
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 999 entries, 0 to 998
Data columns (total 2 columns):
Mary    999 non-null object
968     999 non-null int64
dtypes: int64(1), object(1)
memory usage: 15.7+ KB
 

信息说:

  • 数据集中999条记录
  • 有一个名为Mary的列值为999
  • 有一个名为968的列值为999
  • 列中,一列是数字,另一是非数字 

要真正看到数据帧的内容,我们可以使用head()函数,默认情况下它会返回前五个记录。您还可以传入数字n以返回数据帧的前n个记录。

In [18]:
df.head()
Out[18]:
 Mary968
0 Jessica 155
1 Jessica 77
2 Bob 578
3 Jessica 973
4 Jessica 124
 

这给我们带来了这个练习的第一个问题。该  read_csv  函数处理的第一个记录在文本文件中为头名。这显然是不正确的,因为文本文件没有为我们提供标题名称。

为了纠正这个问题,我们将传递  header  参数给  read_csv  函数并将它设置为  None  (在python中表示为null)。

In [19]:
df = pd.read_csv(Location, header=None)
df.info()
 
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1000 entries, 0 to 999
Data columns (total 2 columns):
0    1000 non-null object
1    1000 non-null int64
dtypes: int64(1), object(1)
memory usage: 15.7+ KB
 

现在让我们看看数据框的最后五条记录

In [20]:
df.tail()
Out[20]:
 01
995 John 151
996 Jessica 511
997 John 756
998 Jessica 294
999 John 152
 

.如果我们想给列指定名字,我们必须传递另一个参数names  。我们也可以省略  header 参数。

In [21]:
df = pd.read_csv(Location, names=['Names','Births'])
df.head(5)
Out[21]:
 NamesBirths
0 Mary 968
1 Jessica 155
2 Jessica 77
3 Bob 578
4 Jessica 973
 

准备数据

 

我们的数据由1880年的婴儿姓名和出生人数组成。我们已经知道我们有1,000条记录,并且没有记录丢失(非空值)。我们可以验证“Names”列仍然只有五个唯一的名称。

我们可以使用数据帧的 unique 属性来查找“Names”列的所有一致记录。

In [23]:
# 方法 1:
df['Names'].unique()
Out[23]:
array(['Mary', 'Jessica', 'Bob', 'John', 'Mel'], dtype=object)
In [24]:
# If you actually want to print the unique values:
for x in df['Names'].unique():
    print(x) 
Mary
Jessica
Bob
John
Mel
In [25]:
# 方法 2:
print(df['Names'].describe()) 
count     1000
unique       5
top        Bob
freq       206
Name: Names, dtype: object
 

由于每个宝贝名称都有多个值,因此我们需要汇总此数据,让它只会出现一次宝贝名称。这意味着1,000行将需要变为5.我们可以通过使用groupby函数来实现这一点

In [26]:
df.groupby?
In [27]:
# Create a groupby object
name = df.groupby('Names')

# Apply the sum function to the groupby object
df = name.sum()
df
Out[27]:
 Births
Names 
Bob 106817
Jessica 97826
John 90705
Mary 99438
Mel 102319
 

分析数据 

要找出最常见的名字或婴儿出生率最高的名字,我们可以执行以下操作之一。

  • 对数据帧排序并选择第一行
  • 使用  max() 属性来查找最大值
In [28]:
# Method 1:
Sorted = df.sort_values(['Births'], ascending=False)
Sorted.head(1)
Out[28]:
 Births
Names 
Bob 106817
In [29]:
# Method 2:
df['Births'].max()
Out[29]:
106817
 
 

呈现数据 

在这里,我们可以绘制  Births 列,并标记图形以显示最终用户图上的最高点。与表格一起,最终用户清楚地知道 Bob 是数据集中最受欢迎的婴儿名称。

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

print("The most popular name")
df.sort_values(by='Births', ascending=False)
 
The most popular name
Out[30]:
 Births
Names 
Bob 106817
Mel 102319
Mary 99438
Jessica 97826
John 90705
 
课程主页        上一课         下一课         

posted on 2018-05-19 07:52  六尺巷人  阅读(492)  评论(0编辑  收藏  举报

导航