第二課 TXT讀取 - 導出 - 選擇頂部/底部記錄 - 描述性統計 - 分組/排序

第2課

建立數據 - 咱們從建立本身的數據集開始分析。這能夠防止閱讀本教程的最終用戶爲獲得下面的結果而不得不下載許多文件。咱們將把這個數據集導出到一個文本文件中,這樣您就能夠得到從文本文件中一些拉取數據的經驗。

獲取數據 - 咱們將學習如何閱讀文本文件。這些數據包括嬰兒的姓名和1880年出生的嬰兒的數量。
準備數據 - 在這裏,咱們將簡單地看一下數據並確保它是乾淨的。乾淨,個人意思是咱們會看看文本文件的內容並發現任何異常。可能包括缺失的數據,數據中的不一致或任何其餘不合適的數據。若是發現這些問題,咱們將不得不決定如何處理這些記錄。
分析數據 - 咱們將簡單地找出特定年份中流行的取名傾向。
呈現數據 - 經過表格數據和圖表,清楚地向最終用戶顯示特定年份中最受歡迎的取名。html

注意:
確保你已經瀏覽了之前的全部課程,由於之前課程中學到的知識將用於此練習。
python

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個嬰兒名稱,咱們將執行如下操做:app

  • 生成0到4之間的隨機數

爲此,咱們將使用函數seedrandintlenrangezipdom

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的名稱。.spa

for i in range(n) - 循環直到 i 等於n,即1,2,3,... n。code

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]:
  Names Births
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]:
  Mary 968
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]:
  0 1
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]:
  Names Births
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
 
課程主頁        上一課          下一課         
相關文章
相關標籤/搜索