簡介
Python 的 pandas
包用于數(shù)據(jù)操作和分析,旨在讓您以直觀的方式處理帶標(biāo)簽或關(guān)聯(lián)數(shù)據(jù)。
pandas
包提供了電子表格功能,但由于您正在使用 Python,因此它比傳統(tǒng)的圖形電子表格程序要快得多且更高效。
在本教程中,我們將介紹如何設(shè)置一個大型數(shù)據(jù)集,pandas
的 groupby()
和 pivot_table()
函數(shù),以及如何可視化數(shù)據(jù)。
要熟悉 pandas
包,您可以閱讀我們的教程《Python 3 中 pandas 包及其數(shù)據(jù)結(jié)構(gòu)的介紹》。
先決條件
本指南將介紹如何在本地桌面或遠程服務(wù)器上使用 pandas
處理數(shù)據(jù)。處理大型數(shù)據(jù)集可能會占用大量內(nèi)存,因此在任何情況下,計算機都需要至少 2GB 內(nèi)存 來執(zhí)行本指南中的一些計算。
在本教程中,我們將使用 Jupyter Notebook 來處理數(shù)據(jù)。如果您尚未安裝,請按照我們的教程安裝并設(shè)置 Python 3 的 Jupyter Notebook。
設(shè)置數(shù)據(jù)
在本教程中,我們將使用美國社會保障網(wǎng)站上提供的有關(guān)嬰兒姓名的數(shù)據(jù),該數(shù)據(jù)以 8MB 的壓縮文件形式提供。
讓我們在本地計算機上激活我們的 Python 3 編程環(huán)境,或者在服務(wù)器上從正確的目錄開始:
cd environments
. my_env/bin/activate
現(xiàn)在讓我們?yōu)槲覀兊捻椖縿?chuàng)建一個新目錄。我們可以稱之為 names
,然后進入該目錄:
mkdir names
cd names
在該目錄中,我們可以使用 curl
命令從社會保障網(wǎng)站獲取 zip 文件:
curl -O https://www.ssa.gov/oact/babynames/names.zip
文件下載完成后,讓我們驗證我們將要使用的所有軟件包是否已安裝:
-
numpy
用于支持多維數(shù)組 -
matplotlib
用于可視化數(shù)據(jù) -
pandas
用于數(shù)據(jù)分析 -
seaborn
用于美化我們的 matplotlib 統(tǒng)計圖形
如果您尚未安裝任何軟件包,請使用 pip
安裝它們,例如:
pip install pandas
pip install matplotlib
pip install seaborn
如果您尚未安裝 numpy
包,它也將被安裝。
現(xiàn)在我們可以啟動 Jupyter Notebook:
jupyter notebook
一旦您進入 Jupyter Notebook 的 Web 界面,您將在那里看到 names.zip
文件。
要創(chuàng)建一個新的筆記本文件,請從右上角的下拉菜單中選擇 New > Python 3:
!創(chuàng)建一個新的 Python 3 筆記本
這將打開一個筆記本。
讓我們從導(dǎo)入我們將要使用的軟件包開始。在我們的筆記本頂部,我們應(yīng)該寫入以下內(nèi)容:
import numpy as np
import matplotlib.pyplot as pp
import pandas as pd
import seaborn
我們可以運行此代碼,并通過鍵入 ALT + ENTER
進入新的代碼塊。
讓我們還告訴 Python Notebook 在線保留我們的圖形:
matplotlib inline
讓我們運行代碼,并通過鍵入 ALT + ENTER
繼續(xù)。
從這里,我們將繼續(xù)解壓縮 zip 存檔,將 CSV 數(shù)據(jù)集加載到 pandas
中,然后連接 pandas
數(shù)據(jù)幀。
解壓縮 Zip 存檔
要將 zip 存檔解壓縮到當(dāng)前目錄中,我們將導(dǎo)入 zipfile
模塊,然后使用文件名(在我們的情況下是 names.zip
)調(diào)用 ZipFile
函數(shù):
import zipfile
zipfile.ZipFile('names.zip').extractall('.')
我們可以運行代碼,并通過鍵入 ALT + ENTER
繼續(xù)。
現(xiàn)在,如果您回到 names
目錄,您將在其中看到以 CSV 格式存儲的姓名數(shù)據(jù)的 .txt
文件。這些文件將對應(yīng)于文件中的年份數(shù)據(jù),從 1881 年到 2015 年。這些文件都遵循類似的命名約定。例如,2015 年的文件名為 yob2015.txt
,而 1927 年的文件名為 yob1927.txt
。
為了查看其中一個文件的格式,讓我們使用 Python 打開一個文件并顯示前 5 行:
open('yob2015.txt','r').readlines()[:5]
運行代碼,并通過鍵入 ALT + ENTER
繼續(xù)。
['Emma,F,20355\n',
'Olivia,F,19553\n',
'Sophia,F,17327\n',
'Ava,F,16286\n',
'Isabella,F,15504\n']
數(shù)據(jù)的格式是首先是姓名(如 Emma
或 Olivia
),然后是性別(女性姓名為 F
,男性姓名為 M
),然后是當(dāng)年出生具有該姓名的嬰兒數(shù)量(2015 年出生的名為 Emma 的嬰兒有 20,355 個)。
有了這些信息,我們就可以將數(shù)據(jù)加載到 pandas
中。
將 CSV 數(shù)據(jù)加載到 pandas 中
要將逗號分隔值數(shù)據(jù)加載到 pandas
中,我們將使用 pd.read_csv()
函數(shù),傳遞文本文件的名稱以及我們決定的列名。我們將將其分配給一個變量,本例中為 names2015
,因為我們使用的是 2015 年出生文件的數(shù)據(jù)。
names2015 = pd.read_csv('yob2015.txt', names = ['Name', 'Sex', 'Babies'])
鍵入 ALT + ENTER
來運行代碼并繼續(xù)。
為了確保這一步成功,讓我們顯示表的頂部:
names2015.head()
當(dāng)我們運行代碼并繼續(xù)使用 ALT + ENTER
時,我們將看到以下輸出:
!names2015.head 輸出
我們的表現(xiàn)在包含了按列組織的名稱、性別和每個名稱出生的嬰兒數(shù)量的信息。
連接 pandas 對象
連接 pandas
對象將允許我們處理 names
目錄中的所有單獨的文本文件。
要連接這些文件,我們首先需要通過將變量分配給未填充的列表數(shù)據(jù)類型來初始化一個列表:
all_years = []
一旦我們這樣做了,我們將使用 for
循環(huán)來遍歷所有年份的文件,范圍從 1880 年到 2015 年。我們將在 2015 年的末尾添加 +1
,以便在循環(huán)中包括 2015 年。
all_years = []
for year in range(1880, 2015+1):
在循環(huán)內(nèi)部,我們將使用字符串格式化程序?qū)⒚總€文本文件的值附加到列表中。我們將把這些值傳遞給 year
變量。同樣,我們將為 Name
、Sex
和 Babies
指定列:
all_years = []
for year in range(1880, 2015+1):
all_years.append(pd.read_csv('yob{}.txt'.format(year),
names = ['Name', 'Sex', 'Babies']))
此外,我們將為每一年創(chuàng)建一個列,以保持這些列的順序。我們可以在每次迭代后使用索引 -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()
函數(shù)將其添加到 pandas
對象中進行連接。我們將使用變量 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)
我們現(xiàn)在可以使用 ALT + ENTER
運行循環(huán),然后通過調(diào)用結(jié)果表的尾部(最底部的行)來檢查輸出:
all_names.tail()
!all_names.tail 輸出
我們的數(shù)據(jù)集現(xiàn)在已經(jīng)完整,準(zhǔn)備在 pandas
中進行進一步處理。
數(shù)據(jù)分組
使用 pandas
,您可以使用 .groupby()
函數(shù)按列對數(shù)據(jù)進行分組。使用我們的 all_names
變量作為完整數(shù)據(jù)集,我們可以使用 groupby()
將數(shù)據(jù)拆分為不同的桶。
讓我們按性別和年份對數(shù)據(jù)集進行分組。我們可以這樣設(shè)置:
group_name = all_names.groupby(['Sex', 'Year'])
我們可以運行代碼并繼續(xù)使用 ALT + ENTER
。
此時,如果我們只調(diào)用 group_name
變量,我們將得到以下輸出:
<pandas.core.groupby.DataFrameGroupBy object at 0x1187b82e8>
這向我們顯示它是一個 DataFrameGroupBy
對象。該對象包含如何對數(shù)據(jù)進行分組的指令,但它不提供如何顯示值的指令。
要顯示值,我們需要提供指令。我們可以計算 .size()
、.mean()
和 .sum()
,例如,以返回一個表。
讓我們從 .size()
開始:
group_name.size()
當(dāng)我們運行代碼并繼續(xù)使用 ALT + ENTER
時,我們的輸出將如下所示:
Sex Year
F 1880 942
1881 938
1882 1028
1883 1054
1884 1172
...
這些數(shù)據(jù)看起來不錯,但它可能更易讀。我們可以通過附加 .unstack
函數(shù)使其更易讀:
group_name.size().unstack()
現(xiàn)在當(dāng)我們運行代碼并繼續(xù)輸入 ALT + ENTER
時,輸出將如下所示:
!group_name.size().unstack() 輸出
這些數(shù)據(jù)告訴我們每年有多少個女性和男性的名字。例如,在 1889 年,有 1,479 個女性名字和 1,111 個男性名字。在 2015 年,有 18,993 個女性名字和 13,959 個男性名字。這顯示隨著時間的推移,名字的多樣性更大。
如果我們想要獲得出生的總嬰兒數(shù),我們可以使用 .sum()
函數(shù)。讓我們將其應(yīng)用于較小的數(shù)據(jù)集,即我們之前創(chuàng)建的單個 yob2015.txt
文件的 names2015
集:
names2015.groupby(['Sex']).sum()
讓我們鍵入 ALT + ENTER
來運行代碼并繼續(xù):
這顯示了 2015 年出生的男性和女性嬰兒的總數(shù),盡管數(shù)據(jù)集中只計算了那一年至少使用了 5 次的名字的嬰兒。
pandas
的 .groupby()
函數(shù)允許我們將數(shù)據(jù)分成有意義的組。
透視表
透視表對于總結(jié)數(shù)據(jù)非常有用。它們可以自動對存儲在一個表中的數(shù)據(jù)進行排序、計數(shù)、求和或求平均值。然后,它們可以在一個新的表中顯示這些操作的結(jié)果。
在 pandas
中,使用 pivot_table()
函數(shù)來創(chuàng)建透視表。
要構(gòu)建一個透視表,我們首先會調(diào)用我們想要處理的 DataFrame,然后是我們想要顯示的數(shù)據(jù),以及它們?nèi)绾畏纸M。
在這個例子中,我們將使用 all_names
數(shù)據(jù),并按照一個維度中的名稱和另一個維度中的年份來顯示嬰兒數(shù)據(jù):
pd.pivot_table(all_names, 'Babies', 'Name', 'Year')
當(dāng)我們鍵入 ALT + ENTER
來運行代碼并繼續(xù)時,我們將看到以下輸出:
!pd.pivot_table(all_names, ‘Babies’, ‘Name’, ‘Year’) 輸出
因為這顯示了很多空值,我們可能希望將名稱和年份保留為列,而不是在一個情況下作為行,在另一個情況下作為列。我們可以通過在方括號中對數(shù)據(jù)進行分組來實現(xiàn):
pd.pivot_table(all_names, 'Babies', ['Name', 'Year'])
當(dāng)我們鍵入 ALT + ENTER
來運行代碼并繼續(xù)時,這個表現(xiàn)在只會顯示每個名稱記錄的年份的數(shù)據(jù):
Name 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
此外,我們可以將數(shù)據(jù)分組為名稱和性別作為一個維度,年份作為另一個維度,如下所示:
pd.pivot_table(all_names, 'Babies', ['Name', 'Sex'], 'Year')
當(dāng)我們運行代碼并繼續(xù)使用 ALT + ENTER
時,我們將看到以下表格:
透視表讓我們可以從現(xiàn)有表格中創(chuàng)建新表格,從而決定我們希望如何對數(shù)據(jù)進行分組。
可視化數(shù)據(jù)
通過使用 pandas
與其他包如 matplotlib
,我們可以在筆記本中可視化數(shù)據(jù)。
我們將要可視化有關(guān)特定名稱多年來的受歡迎程度的數(shù)據(jù)。為了做到這一點,我們需要設(shè)置和排序索引,以重新處理數(shù)據(jù),從而可以看到特定名稱受歡迎程度的變化。
pandas
包讓我們可以進行分層或多級索引,這使我們能夠存儲和操作具有任意數(shù)量維度的數(shù)據(jù)。
我們將使用性別、名稱和年份的信息來索引我們的數(shù)據(jù)。我們還希望對索引進行排序:
all_names_index = all_names.set_index(['Sex','Name','Year']).sort_index()
鍵入 ALT + ENTER
來運行并繼續(xù)到我們的下一行,我們將讓筆記本顯示新的索引 DataFrame:
all_names_index
運行代碼并繼續(xù)使用 ALT + ENTER
,輸出將如下所示:
!all_names_index 輸出
接下來,我們將編寫一個函數(shù),用于繪制名稱隨時間的受歡迎程度。我們將命名該函數(shù)為 name_plot
,并將 sex
和 name
作為參數(shù)傳遞,我們將在運行函數(shù)時調(diào)用這些參數(shù)。
def name_plot(sex, name):
現(xiàn)在,我們將設(shè)置一個名為 data
的變量來保存我們創(chuàng)建的表。我們還將使用 pandas
DataFrame 的 loc
來根據(jù)索引的值選擇我們的行。在我們的情況下,我們希望 loc
基于 MultiIndex 中的字段組合,涉及到 sex
和 name
數(shù)據(jù)。
讓我們將這個構(gòu)造寫入我們的函數(shù)中:
def name_plot(sex, name):
data = all_names_index.loc[sex, name]
最后,我們將使用 matplotlib.pyplot
來繪制值,我們將其導(dǎo)入為 pp
。然后,我們將性別和名稱數(shù)據(jù)的值繪制到索引上,對于我們的目的來說,索引是年份。
def name_plot(sex, name):
data = all_names_index.loc[sex, name]
pp.plot(data.index, data.values)
鍵入 ALT + ENTER
來運行代碼并移動到下一個單元格?,F(xiàn)在,我們可以使用我們選擇的性別和名稱調(diào)用函數(shù),比如使用給定名稱 Danica
的女性名稱 F
。
name_plot('F', 'Danica')
當(dāng)你現(xiàn)在鍵入 ALT + ENTER
,你將收到以下輸出:
!Danica 名稱繪圖 輸出
請注意,根據(jù)您使用的系統(tǒng),您可能會收到有關(guān)字體替換的警告,但數(shù)據(jù)仍將正確繪制。
通過查看可視化,我們可以看到女性名稱 Danica 在 1990 年左右有一小波動,并在 2010 年之前達到了高峰。
我們創(chuàng)建的函數(shù)可以用于繪制多個名稱的數(shù)據(jù),以便我們可以看到不同名稱隨時間的趨勢。
讓我們首先將我們的繪圖稍微放大一點:
pp.figure(figsize = (18, 8))
接下來,讓我們創(chuàng)建一個包含我們想要繪制的所有名稱的列表:
pp.figure(figsize = (18, 8))
names = ['Sammy', 'Jesse', 'Drew', 'Jamie']
現(xiàn)在,我們可以通過 for
循環(huán)遍歷列表,并繪制每個名稱的數(shù)據(jù)。首先,我們將嘗試將這些性別中性名稱作為女性名稱:
pp.figure(figsize = (18, 8))
names = ['Sammy', 'Jesse', 'Drew', 'Jamie']
for name in names:
name_plot('F', name)
為了使這些數(shù)據(jù)更容易理解,讓我們包括一個圖例:
pp.figure(figsize = (18, 8))
names = ['Sammy', 'Jesse', 'Drew', 'Jamie']
for name in names:
name_plot('F', name)
pp.legend(names)
我們將鍵入 ALT + ENTER
來運行代碼并繼續(xù),然后我們將收到以下輸出:
!名稱繪圖,女性名稱 輸出
盡管每個名稱作為女性名稱的受歡迎程度都在緩慢增長,但在 1980 年左右,名稱 Jamie 作為女性名稱非常受歡迎。
讓我們以相同的名稱繪制相同的名稱,但這次作為男性名稱:
pp.figure(figsize = (18, 8))
names = ['Sammy', 'Jesse', 'Drew', 'Jamie']
for name in names:
name_plot('M', name)
pp.legend(names)
再次鍵入 ALT + ENTER
來運行代碼并繼續(xù)。圖表將如下所示:
!名稱繪圖,男性名稱 輸出
這些數(shù)據(jù)顯示了更多名稱的受歡迎程度,Jesse 通常是最受歡迎的選擇,并且在 1980 年代和 1990 年代特別受歡迎。
從這里,您可以繼續(xù)使用名稱數(shù)據(jù),創(chuàng)建關(guān)于不同名稱及其受歡迎程度的可視化,并創(chuàng)建其他腳本來查看不同數(shù)據(jù)以進行可視化。
結(jié)論
本教程介紹了處理大型數(shù)據(jù)集的方法,從設(shè)置數(shù)據(jù)開始,到使用 groupby()
和 pivot_table()
對數(shù)據(jù)進行分組,使用 MultiIndex 對數(shù)據(jù)進行索引,并使用 matplotlib
包可視化 pandas
數(shù)據(jù)。
許多組織和機構(gòu)提供數(shù)據(jù)集,您可以繼續(xù)學(xué)習(xí) pandas
和數(shù)據(jù)可視化。例如,美國政府通過 data.gov 提供數(shù)據(jù)。文章來源:http://www.zghlxwxcb.cn/news/detail-827354.html
您可以通過閱讀我們的指南了解如何使用 matplotlib
可視化數(shù)據(jù),包括《如何使用 matplotlib 在 Python 3 中繪制數(shù)據(jù)》和《如何使用 Python 3 和 matplotlib 繪制詞頻圖表》。文章來源地址http://www.zghlxwxcb.cn/news/detail-827354.html
到了這里,關(guān)于Python 3 中使用 pandas 和 Jupyter Notebook 進行數(shù)據(jù)分析和可視化的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!