Matplotlib 提供了 subplots
函式,可以方便地在一張圖表中繪製多個子圖,便於比較和分析不同資料集。Pandas Series 作為 Pandas 重要的資料結構之一,提供了一維標籤資料的操作功能,包含建立、索引、切片、過濾和查詢等。開發者可以根據需求,從列表、字典、NumPy 陣列或標量值建立 Series。理解 Series 的索引機制,包含使用標籤和位置索引,對於高效地存取和運算元據至關重要。使用 loc
、iloc
和布林遮罩可以根據不同條件選取資料子集,方便進行資料分析和處理。此外,複製引數 copy
的正確使用,可以避免意外修改原始資料,確保資料的完整性。
使用Matplotlib進行多圖表繪製
在進行資料視覺化時,經常需要在同一張圖表中繪製多個子圖,以便於比較和分析不同的資料。Matplotlib是一個強大的Python資料視覺化函式庫,提供了方便的方法來建立多個子圖。
建立多個子圖
首先,讓我們觀察以下程式碼:
myfig, myaxs = myplt.subplots(2, 2)
這裡,myplt.subplots(2, 2)
傳回了一個圖表物件myfig
和一個2x2的軸物件陣列myaxs
。這意味著我們可以在同一張圖表中繪製四個不同的子圖。
範例程式:Chap6_Example6.17.py
下面是完整的範例程式:
import matplotlib.pyplot as myplt
import numpy as mynp
# 建立資料
myxaxis_data = mynp.arange(1, 11)
my_y1 = myxaxis_data
my_y2 = myxaxis_data * 2
my_y3 = myxaxis_data ** 2
my_y4 = myxaxis_data ** 3
# 建立圖表和軸物件
myfig, myax = myplt.subplots(2, 2)
# 繪製子圖1
myax[0, 0].plot(myxaxis_data, my_y1, color='r', marker='o')
myax[0, 0].set(xlabel='X軸資料', ylabel='Y軸資料', title='相同值線性')
# 繪製子圖2
myax[0, 1].plot(myxaxis_data, my_y2, color='b', marker='o')
myax[0, 1].set(xlabel='X軸資料', ylabel='Y軸資料', title='X軸的兩倍')
# 繪製子圖3
myax[1, 0].plot(myxaxis_data, my_y3, color='y', marker='o')
myax[1, 0].set(xlabel='X軸資料', ylabel='Y軸資料', title='平方函式')
# 繪製子圖4
myax[1, 1].plot(myxaxis_data, my_y4, color='g', marker='o')
myax[1, 1].set(xlabel='X軸資料', ylabel='Y軸資料', title='立方函式')
這個範例程式建立了四個不同的子圖,每個子圖都有自己的資料和標題。透過使用myplt.subplots(2, 2)
,我們可以輕鬆地建立多個子圖,並使用myax
陣列來存取每個子圖的軸物件。
內容解密:
myplt.subplots(2, 2)
傳回了一個圖表物件myfig
和一個2x2的軸物件陣列myaxs
。myax[0, 0]
、myax[0, 1]
、myax[1, 0]
和myax[1, 1]
分別代表四個子圖的軸物件。plot()
函式用於繪製每個子圖的資料。set()
函式用於設定每個子圖的標題、X軸標籤和Y軸標籤。
圖表翻譯:
以下是使用Mermaid語法繪製的流程圖:
flowchart TD A[開始] --> B[建立資料] B --> C[建立圖表和軸物件] C --> D[繪製子圖1] D --> E[繪製子圖2] E --> F[繪製子圖3] F --> G[繪製子圖4] G --> H[顯示圖表]
這個流程圖展示了建立多個子圖的步驟,從建立資料到顯示圖表。
重點回顧
- 條形圖可以用於比較不同類別的值,包括垂直和水平條形圖。
- 餅圖適合顯示類別資料的相對比例。
- 散點圖用於視覺化兩個連續變數之間的關係。
- 直方圖用於視覺化連續資料的分佈。
- 子圖允許在單個圖表中繪製多個圖。
問題與練習
- 如何在Python中建立一個垂直條形圖?
- 如何在條形圖中為條形新增標籤?
- 什麼是水平條形圖和堆積疊條形圖?如何在Python中建立它們?
- 給出一個垂直堆積疊條形圖的例子。
- 給出一個水平堆積疊條形圖的例子。
- 如何在Python中建立一個分組條形圖(叢集條形圖)?
- 如何在Python中建立一個餅圖?
- 什麼是直方圖?如何在Python中建立一個直方圖?
- 如何在Python中建立一個散點圖?
- 什麼是子圖?如何在matplotlib中使用它來建立單個圖表中的多個圖?
在下一章中,我們將探討pandas系列在資料科學中的應用。pandas系列是一種基本的資料結構,用於處理一維標記資料,這在許多資料分析任務中非常常見。透過pandas系列,我們可以高效地組織、存取和分析資料。
探索 Pandas Series:Python 中的資料科學基本
簡介
Pandas 是一款強大且流行的 Python 套件,適用於資料分析和操作。它提供簡單易用的資料結構和分析功能,適用於結構化資料,包括表格、時間序列和異質資料。Pandas 與其他資料分析函式庫如 Matplotlib、SciPy 和 Scikit-learn 相容,並根據 NumPy 建立,因此需要 NumPy 函式庫來運作。Series 和 DataFrame 是 Pandas 中的兩個主要資料結構。Series 相似於電子試算表中的欄或 SQL 表中的欄,是一維的命名陣列,可以儲存任何型別的資料(整數、浮點數、文字等)。DataFrame 是二維的標記資料結構,可以儲存不同型別的資料。
Pandas 的特點
Pandas 提供了多種資料操作和分析功能,包括資料清理、合併和連線、重塑、過濾、排序、分組和彙總等。此外,Pandas 還支援複雜的資料分析活動,如機器學習、統計建模和時間序列分析。Pandas 廣泛應用於資料科學、機器學習、金融、經濟學、社會科學等領域,其受歡迎程度源於其簡單性、適應性和強大的功能,使其成為 Python 資料分析的重要工具。
安裝 Pandas
我們可以使用 pip 安裝 Pandas:
pip install pandas
Python 程式碼通常使用 import pandas as mypd
來匯入 Pandas 函式庫並將其別名為 mypd
。
Series 結構
Series 是一維的標記陣列,可以儲存任何型別的資料。Series 的值可以更改,但 Series 的大小是不可更改的。下面是 Series 的基本結構:
import pandas as mypd
# 建立一個 Series 從一個列表
series = mypd.Series([1, 2, 3, 4, 5])
print(series)
這將輸出:
0 1
1 2
2 3
3 4
4 5
dtype: int64
Series 建構函式
Series 的建構函式為 Series(data=None, index=None, dtype=None, name=None, copy=None, fastpath=False)
。其中:
data
: Series 中儲存的資料,可以是標量值、字典、列表或 NumPy 陣列。index
: Series 的索引標籤,可以是字典、列表、陣列或範圍。如果未提供索引,Series 將使用預設的整數索引從 0 開始。dtype
: Series 中值的資料型別。如果未提供,Pandas 將嘗試從輸入資料中推斷資料型別。name
: Series 的名稱。copy
: 用於決定是否複製輸入資料。fastpath
: 大多數使用者不需要使用此引數,因為它僅用於內部最佳化。
建立 Series
我們可以使用 mypd.Series()
函式建立一個 Series:
import pandas as mypd
# 建立一個 Series 從一個列表
series = mypd.Series([1, 2, 3, 4, 5])
print(series)
這將輸出:
0 1
1 2
2 3
3 4
4 5
dtype: int64
內容解密:
在上面的程式碼中,我們建立了一個 Series 從一個列表 [1, 2, 3, 4, 5]
。Series 的索引標籤預設從 0 開始,因此輸出中顯示的索引標籤為 0
、1
、2
、3
和 4
。Series 的值為 [1, 2, 3, 4, 5]
,資料型別為 int64
。
圖表翻譯:
下面是 Series 的結構圖:
graph LR A[Series] --> B[索引標籤] A --> C[值] B --> D[0] B --> E[1] B --> F[2] B --> G[3] B --> H[4] C --> I[1] C --> J[2] C --> K[3] C --> L[4] C --> M[5]
這個圖表顯示了 Series 的結構,其中索引標籤為 0
、1
、2
、3
和 4
,值為 [1, 2, 3, 4, 5]
。
建立Pandas Series
Pandas Series是一種一維標籤資料結構,類別似於一列資料。它可以從列表、字典或其他資料結構建立。
從列表建立Series
當從列表建立Series時,如果沒有指定索引,Pandas將自動建立一個預設的整數索引。
import pandas as pd
mylist = [1, 2, 3, 4, 5]
mypd_series = pd.Series(mylist)
print(mypd_series)
輸出:
0 1
1 2
2 3
3 4
4 5
dtype: int64
從字典建立Series
當從字典建立Series時,字典的鍵將被用作Series的索引,字典的值將被用作Series的資料。
mydict = {'key1': 1, 'key2': 2, 'key3': 3, 'key4': 4, 'key5': 5}
mypd_series = pd.Series(mydict)
print(mypd_series)
輸出:
key1 1
key2 2
key3 3
key4 4
key5 5
dtype: int64
內容解密:
在上面的例子中,我們可以看到Pandas Series如何從列表和字典建立。當從列表建立Series時,Pandas自動建立了一個預設的整數索引。當從字典建立Series時,字典的鍵被用作Series的索引,字典的值被用作Series的資料。
圖表翻譯:
flowchart TD A[建立Series] --> B[從列表建立] B --> C[自動建立預設索引] A --> D[從字典建立] D --> E[使用字典鍵作為索引]
這個流程圖展示了建立Pandas Series的過程。當從列表建立Series時,Pandas自動建立了一個預設的整數索引。當從字典建立Series時,字典的鍵被用作Series的索引。
建立Pandas系列
Pandas系列是一種一維標籤資料結構,類別似於一維陣列,但比陣列更強大。它可以包含不同型別的資料,包括整數、浮點數、字串等。
從NumPy陣列建立Pandas系列
我們可以使用pd.Series()
函式從NumPy陣列建立Pandas系列。下面的程式碼示範瞭如何從NumPy陣列建立Pandas系列:
import pandas as pd
import numpy as np
# 建立一個NumPy陣列
my_array = np.array([11, 12, 13, 14, 15])
# 建立一個Pandas系列
my_series = pd.Series(my_array)
print(my_series)
輸出:
0 11
1 12
2 13
3 14
4 15
dtype: int32
從標量值建立Pandas系列
如果我們想從標量值建立Pandas系列,我們需要提供一個索引。標量值將根據索引的長度重複。下面的程式碼示範瞭如何從標量值建立Pandas系列:
import pandas as pd
# 建立一個Pandas系列從標量值
my_series = pd.Series(10, index=[1, 2, 3, 4])
print(my_series)
輸出:
1 10
2 10
3 10
4 10
dtype: int64
內容解密:
在上面的程式碼中,我們使用pd.Series()
函式從NumPy陣列和標量值建立Pandas系列。當建立系列時,Pandas會自動為每個元素分配一個索引。對於從NumPy陣列建立的系列,索引預設為整數索引。對於從標量值建立的系列,我們需要提供一個索引,以便Pandas知道如何重複標量值。
圖表翻譯:
flowchart TD A[建立NumPy陣列] --> B[建立Pandas系列] B --> C[輸出Pandas系列] C --> D[重複標量值] D --> E[輸出最終結果]
在這個流程圖中,我們首先建立一個NumPy陣列,然後使用pd.Series()
函式建立一個Pandas系列。接著,我們輸出Pandas系列,並重複標量值根據索引的長度。最後,我們輸出最終結果。
使用Pandas RangeIndex建立系列
Pandas的RangeIndex是一種預設的索引型別,代表了一個整數序列,常用於沒有指定索引的DataFrames和系列中。以下是建立一個Pandas系列的語法和程式碼範例:
import pandas as pd
# 建立一個列表
my_list = [11, 12, 13, 14, 15]
# 建立一個Pandas系列
my_series = pd.Series(my_list)
# 設定系列的索引為RangeIndex
my_series.index = pd.RangeIndex(start=6, stop=11, step=1)
# 輸出系列
print(my_series)
輸出結果:
6 11
7 12
8 13
9 14
10 15
dtype: int64
在這個範例中,我們首先建立一個列表my_list
,然後使用pd.Series()
函式建立一個Pandas系列my_series
。接下來,我們設定系列的索引為RangeIndex
,指定起始值為6,結束值為11,步長為1。最後,我們輸出系列的結果。
內容解密:
pd.RangeIndex()
函式用於建立一個RangeIndex索引物件。start
引數指定索引的起始值。stop
引數指定索引的結束值。step
引數指定索引的步長。dtype
引數指定索引的資料型別。copy
引數指定是否複製索引物件。name
引數指定索引物件的名稱。
圖表翻譯:
flowchart TD A[建立列表] --> B[建立Pandas系列] B --> C[設定RangeIndex索引] C --> D[輸出系列]
在這個流程圖中,我們首先建立一個列表,然後建立一個Pandas系列。接下來,我們設定系列的索引為RangeIndex,最後輸出系列的結果。
建立具有指定資料型別和名稱的 Pandas Series
Pandas Series 的資料型別(dtype)可以透過 Series()
建構函式進行指定,從而對 Series 中的元素資料型別進行明確控制。同時,name
引數可以用於為 Series 賦予一個名稱,提供給資料的標籤。以下是相關示例程式碼:
import pandas as pd
# 定義列表資料
my_list = [11, 12, 13, 14, 15]
# 建立具有 float 資料型別的 Pandas Series
series_float = pd.Series(my_list, dtype='float')
# 指定 Series 的名稱
series_float.name = "系列名稱"
# 指定索引的名稱
series_float.index.name = "索引名稱"
print(series_float)
輸出結果如下:
索引名稱
0 11.0
1 12.0
2 13.0
3 14.0
4 15.0
名稱: 系列名稱, dtype: float64
內容解密:
- 資料型別指定:透過
dtype
引數,可以指定 Series 中元素的資料型別。在這個例子中,我們將my_list
中的整數轉換為浮點數,以示範如何控制 Series 的資料型別。 - Series 名稱:使用
name
屬性,可以為 Series 賦予一個名稱。這個名稱將出現在輸出結果中,作為 Series 的標籤。 - 索引名稱:同樣地,使用
index.name
屬性,可以為 Series 的索引賦予一個名稱。這個名稱將出現在輸出結果中,作為索引的標籤。 - 輸出結果:最終輸出的 Series 顯示了指定的資料型別、Series 名稱和索引名稱。每個元素都以浮點數形式呈現,且具有明確的索引和 Series 名稱。
圖表翻譯:
flowchart TD A[定義列表資料] --> B[建立 Pandas Series] B --> C[指定 Series 名稱] C --> D[指定索引名稱] D --> E[輸出結果]
這個流程圖描述了建立具有指定資料型別和名稱的 Pandas Series 的步驟:從定義列表資料開始,到建立 Series、指定名稱,最後輸出結果。每個步驟都對應到程式碼中的特定操作,展示瞭如何控制 Series 的資料型別和名稱。
探索 Pandas Series 的複製引數
在使用 Pandas Series 進行資料操作時,複製引數(copy parameter)扮演著重要的角色。它控制著當您修改或操作資料時,是否會建立一個深度複製(deep copy)或是參考複製(reference copy)。當您設定 copy=True
時,會建立一個深度複製,確保對新 Series 的修改不會影響原始資料。相反地,設定 copy=False
會導致建立一個參考複製,這允許對新 Series 的修改影響原始資料,這樣可以節省記憶體,但需要謹慎以避免意外的修改。
這個引數在需要確保資料完整性和獨立性的情況下尤其有用,例如在使用 Pandas 進行探索性資料分析和操作時。下面的範例程式碼將展示這個引數的作用:
import pandas as pd
import numpy as np
# 建立一個 NumPy 陣列
my_ndarray = np.array([11, 12, 13, 14])
# 使用 copy=False 建立 Series
my_series = pd.Series(my_ndarray, copy=False)
# 修改 Series 中的元素
my_series[1] = 32
print("當 copy=False 時,不會建立獨立的複製。")
print("my_series 的資料是:")
print(my_series)
print(f"當 copy=False 時,my_ndarray 的資料是:{my_ndarray}")
# 建立另一個 NumPy 陣列
my_ndarray2 = np.array([11, 12, 13, 14])
# 使用 copy=True 建立 Series
my_series2 = pd.Series(my_ndarray2, copy=True)
# 修改 Series 中的元素
my_series2[1] = 32
print("當 copy=True 時,會建立獨立的複製。")
print("my_series2 的資料是:")
print(my_series2)
print(f"當 copy=True 時,my_ndarray2 的資料是:{my_ndarray2}")
內容解密:
copy=False
時,Pandas 會建立一個參考複製,這意味著對新 Series 的修改會影響原始 NumPy 陣列。copy=True
時,Pandas 會建立一個深度複製,這確保了對新 Series 的修改不會影響原始 NumPy 陣列。- 這個引數對於控制資料操作的行為和確保資料的完整性非常重要。
圖表翻譯:
flowchart TD A[原始資料] -->|copy=False|> B[參考複製] B --> C[修改 Series] C --> D[影響原始資料] A -->|copy=True|> E[深度複製] E --> F[修改 Series] F --> G[不影響原始資料]
圖表解釋:
這個流程圖展示了當使用 copy=False
和 copy=True
時,Pandas Series 的行為差異。當 copy=False
時,修改 Series 會影響原始資料;而當 copy=True
時,修改 Series 不會影響原始資料。這個圖表幫助理解複製引數如何影響資料操作的結果。
內容解密:複製資料的重要性
在進行資料操作時,瞭解複製資料的機制至關重要。讓我們深入探討一下 copy()
函式的作用和其引數 copy
的影響。
當我們建立一個新的資料結構(如 Series 或 ndarray)時,我們可以選擇是否建立一個獨立的複製品。這一選擇對於後續的資料操作有著重要的影響。
import numpy as np
import pandas as pd
# 建立原始資料
myseries = pd.Series([11, 32, 13, 14], index=[0, 1, 2, 3])
myndarray = np.array([11, 32, 13, 14])
# 複製資料,copy=False
myseries2 = myseries.copy(False)
myndarray2 = myndarray.copy()
print("當 copy=False 時,無論是否建立獨立複製。myseries 資料是:")
print(myseries2)
print(f"當 copy=False 時,myndarray 資料是:\n{myndarray2}")
# 複製資料,copy=True
myseries3 = myseries.copy(True)
myndarray3 = myndarray.copy()
print("\n當 copy=True 時,建立獨立複製。myseries 資料是:")
print(myseries3)
print(f"當 copy=True 時,myndarray 資料是:\n{myndarray3}")
圖表翻譯:複製資料流程
flowchart TD A[原始資料] --> B[複製選擇] B --> C[copy=False: 分享記憶體] B --> D[copy=True: 建立新記憶體] C --> E[修改原始資料: 影響複製] D --> F[修改原始資料: 不影響複製]
在上述程式碼中,我們首先建立了一個 Series 物件 myseries
和一個 ndarray 物件 myndarray
。接著,我們使用 copy()
函式建立了這些物件的複製品,並分別設定 copy
引數為 False
和 True
。
結果顯示,當 copy=False
時,對原始資料的修改會影響到複製品;而當 copy=True
時,對原始資料的修改不會影響到複製品。這是因為 copy=True
建立了一個完全獨立的記憶體空間,用於儲存複製品的資料。
因此,在進行資料操作時,瞭解 copy()
函式的作用和其引數 copy
的影響至關重要,以確保資料的正確性和安全性。
存取系列值:使用 head
和 tail
方法
在 Pandas 中,head
和 tail
方法分別用於存取系列(Series)的前幾行和後幾行。這兩個方法都可以根據需要設定要存取的行數。
head
方法
head
方法用於存取系列的前幾行。預設情況下,它會傳回系列的前五行。但是,你也可以透過傳入一個整數引數 n
來指定要傳回的行數。
import pandas as pd
# 建立一個範例系列
my_series = pd.Series([i for i in range(20)])
# 預設情況下,傳回前五行
print(my_series.head())
# 傳回前兩行
print(my_series.head(n=2))
tail
方法
tail
方法用於存取系列的後幾行。同樣,預設情況下,它會傳回系列的後五行。你也可以透過傳入一個整數引數 n
來指定要傳回的行數。如果 n
是負數,則會傳回除前 n
行以外的所有行。
# 傳回後五行
print(my_series.tail())
# 傳回後兩行
print(my_series.tail(n=2))
# 等同於傳回後兩行
print(my_series.tail(n=-18))
執行結果
當你執行這些方法時,會得到以下輸出:
0 0
1 1
2 2
3 3
4 4
dtype: int64
0 0
1 1
dtype: int64
這些方法對於快速瀏覽和檢查你的資料非常有用,尤其是在處理大型資料集時。透過使用 head
和 tail
方法,你可以輕鬆地檢視你的資料的開始和結束部分,從而更好地理解你的資料結構和內容。
存取Pandas系列中的元素
Pandas系列中的個別元素可以使用索引標籤或元素的整數位置來存取。以下是相關語法:
mypd_series[x]
其中,x
可以是索引值,例如mypd_series[3]
,這將傳回索引3處的值。索引列表mypd_series[[1,2,4]]
,這將傳回索引1、2和4處的值。對於切片mypd_series[2:5]
,這將傳回從索引2到索引4的值。
以下是示例程式碼Chap7_Example7.9.py
,展示如何使用索引標籤和整數位置存取元素:
import pandas as pd
# 建立一個Pandas系列
mylist = [11, 12, 13, 14, 15]
mypd_series = pd.Series(mylist, index=['r', 's', 't', 'u', 'v'])
# 使用索引標籤存取元素
print(mypd_series['u'])
# 使用整數位置存取元素
print(mypd_series[3])
輸出:
14
這個示例展示瞭如何使用索引標籤和整數位置存取Pandas系列中的元素。
使用Pandas進行系列資料切片
Pandas系列可以透過索引標籤或整數位置進行切片。以下程式碼示範瞭如何使用Pandas進行系列資料切片:
import pandas as pd
# 建立一個Pandas系列
my_list = [11, 12, 13, 14, 15]
pd_series = pd.Series(my_list, index=['r', 's', 't', 'u', 'v'])
# 使用索引標籤進行切片
print(pd_series['r':'u'])
# 使用整數位置進行切片
print(pd_series[1:4])
輸出結果:
r 11
s 12
t 13
u 14
dtype: int64
s 12
t 13
u 14
dtype: int64
從上述範例中,我們可以觀察到兩個重要點:
- 在根據標籤的切片中,結束/停止屬性是包含的,這就是為什麼我們可以看到索引標籤
u
被包含在內。 - 在根據索引的切片中,結束/停止屬性不包含,如果指定的話。這就是為什麼四不被包含在
[1:4]
中,我們可以看到值從第一個索引到第三個索引被傳回。
然而,使用索引方法有一個問題。如果我們嘗試存取指定索引或標籤(根據位置或根據標籤的選擇)但不存在的資料,則會出現錯誤。例如,在相同的程式碼中,如果我們嘗試使用 print(pd_series[10])
,則會出現 IndexError: index 10 is out of bounds for axis 0 with size 5
錯誤。如果我們嘗試使用 print(pd_series['a'])
,則會出現 KeyError: 'a'
錯誤。
為了克服這個問題,我們可以使用 get()
方法,如下所示:
print(pd_series.get(10))
內容解密:
在上述程式碼中,我們首先匯入 pandas
函式庫並建立一個 pandas
系列 pd_series
。然後,我們使用索引標籤和整數位置進行切片。最後,我們使用 get()
方法來存取指定索引的值,如果不存在則傳回 None
。
圖表翻譯:
flowchart TD A[建立Pandas系列] --> B[使用索引標籤進行切片] B --> C[使用整數位置進行切片] C --> D[使用get()方法存取值] D --> E[傳回值或None]
在這個流程圖中,我們展示瞭如何建立一個 pandas
系列,然後使用索引標籤和整數位置進行切片,最後使用 get()
方法來存取指定索引的值。如果不存在則傳回 None
。
使用get()方法存取資料
在Pandas中,get()
方法允許您使用標籤或索引存取系列中的值。當您嘗試存取不存在的索引或標籤時,get()
方法傳回None
,除非您指定了預設值。
import pandas as pd
# 建立一個Pandas Series
mypd_series = pd.Series([11, 12, 13], index=['a', 'b', 'c'])
# 存取不存在的索引或標籤
print(mypd_series.get('a')) # 輸出:11
print(mypd_series.get('d')) # 輸出:None
# 指定預設值
print(mypd_series.get('d', default=22)) # 輸出:22
使用loc和iloc索引器存取值
Pandas提供了兩種索引器:loc
和iloc
。loc
索引器使用標籤進行索引,而iloc
索引器使用整數位置進行索引。
# 使用loc索引器存取值
print(mypd_series.loc['a']) # 輸出:11
print(mypd_series.loc[['a', 'b']]) # 輸出:[11, 12]
# 使用iloc索引器存取值
print(mypd_series.iloc[0]) # 輸出:11
print(mypd_series.iloc[[0, 1]]) # 輸出:[11, 12]
內容解密:
在上述程式碼中,我們建立了一個Pandas Series mypd_series
,然後使用get()
方法存取系列中的值。當我們嘗試存取不存在的索引或標籤時,get()
方法傳回None
,除非我們指定了預設值。接著,我們使用loc
和iloc
索引器存取系列中的值。loc
索引器使用標籤進行索引,而iloc
索引器使用整數位置進行索引。
圖表翻譯:
flowchart TD A[建立Pandas Series] --> B[使用get()方法存取值] B --> C[使用loc索引器存取值] C --> D[使用iloc索引器存取值] D --> E[輸出結果]
在上述圖表中,我們展示了建立Pandas Series、使用get()
方法存取值、使用loc
索引器存取值和使用iloc
索引器存取值的過程。最終,我們輸出結果。
使用iloc和loc存取資料
在Pandas中,iloc
和loc
是兩種不同方式來存取資料。iloc
是根據整數位置的存取,而loc
是根據標籤的存取。
使用iloc
iloc
是根據整數位置的存取,從0開始。以下是使用iloc
的範例:
import pandas as pd
mylist = [11, 12, 13, 14, 15]
mypd_series = pd.Series(mylist, index=['r', 's', 't', 'u', 'v'])
print(mypd_series.iloc[1]) # 輸出:12
print(mypd_series.iloc[[1, 3]]) # 輸出:[12, 14]
print(mypd_series.iloc[1:3]) # 輸出:[12, 13]
print(mypd_series.iloc[-1]) # 輸出:15
內容解密:
mypd_series.iloc[1]
:存取索引為1的元素,即12。mypd_series.iloc[[1, 3]]
:存取索引為1和3的元素,即12和14。mypd_series.iloc[1:3]
:存取索引從1到3的元素,即12和13。mypd_series.iloc[-1]
:存取最後一個元素,即15。
使用loc
loc
是根據標籤的存取。以下是使用loc
的範例:
print(mypd_series.loc['s']) # 輸出:12
print(mypd_series.loc[['s', 'u']]) # 輸出:[12, 14]
print(mypd_series.loc['s':'u']) # 輸出:[12, 13, 14]
圖表翻譯:
flowchart TD A[開始] --> B[使用iloc] B --> C[使用loc] C --> D[輸出結果]
圖表翻譯:
mypd_series.loc['s']
:存取標籤為’s’的元素,即12。mypd_series.loc[['s', 'u']]
:存取標籤為’s’和’u’的元素,即12和14。mypd_series.loc['s':'u']
:存取標籤從’s’到’u’的元素,即12、13和14。
使用布林遮罩進行條件選擇
在 Pandas 中,使用布林遮罩(Boolean Masking)是一種強大的資料選擇方法。它允許您根據條件從 Series 或 DataFrame 中選擇值。這種方法適用於 iloc
、loc
和正常索引器。
基本概念
布林遮罩是指一個布林值的陣列,該陣列的每個元素對應於 Series 或 DataFrame 中的每個值。當布林值為 True
時,相應的值會被選擇。
範例
import pandas as pd
# 建立一個 Pandas Series
mylist = [11, 12, 13, 14, 15]
series = pd.Series(mylist)
# 使用布林遮罩選擇值
mask = series > 12
print(series[mask])
在這個範例中,mask
是一個布林值的陣列,表示 Series 中的每個值是否大於 12。然後,使用 series[mask]
選擇符合條件的值。
結果
2 13
3 14
4 15
dtype: int64
如您所見,選擇了 Series 中大於 12 的值。
使用 iloc 和 loc
布林遮罩也可以與 iloc
和 loc
索引器一起使用。以下是範例:
# 使用 iloc 和布林遮罩
print(series.iloc[mask])
# 使用 loc 和布林遮罩
print(series.loc[mask])
這兩個範例都會產生相同的結果,因為 iloc
和 loc
都支援布林遮罩。
使用布林值陣列進行Series索引
在Pandas中,當您有一個Series物件時,可以使用布林值陣列來選擇特定的元素。這種方法允許您根據條件選擇Series中的元素。
範例程式碼
import pandas as pd
# 建立一個Series物件
mylist = [10, 11, 12, 13, 14, 15]
mypd_series = pd.Series(mylist)
# 使用布林值陣列進行索引
bool_array = [True, False, True, False, True, False]
print(mypd_series[bool_array])
輸出結果
0 10
2 12
4 14
dtype: int64
使用iloc和loc進行索引
除了使用布林值陣列進行索引外,您還可以使用iloc
和loc
方法來選擇Series中的元素。
iloc方法
print(mypd_series.iloc[[0, 2, 4]])
loc方法
print(mypd_series.loc[[0, 2, 4]])
輸出結果
0 10
2 12
4 14
dtype: int64
使用get方法進行索引
您還可以使用get
方法來選擇Series中的元素。
print(mypd_series.get([0, 2, 4]))
輸出結果
0 10
2 12
4 14
dtype: int64
內容解密:
在上述範例中,我們建立了一個Series物件mypd_series
,然後使用布林值陣列bool_array
進行索引。布林值陣列中的True
值對應於Series中的元素將被選擇。然後,我們使用iloc
和loc
方法來選擇Series中的元素,最後使用get
方法來選擇Series中的元素。
圖表翻譯:
flowchart TD A[建立Series物件] --> B[使用布林值陣列進行索引] B --> C[使用iloc方法進行索引] C --> D[使用loc方法進行索引] D --> E[使用get方法進行索引] E --> F[輸出結果]
在這個流程圖中,我們展示瞭如何建立一個Series物件,然後使用不同的方法來選擇Series中的元素。每一步驟都對應於上述範例中的程式碼。
Pandas Series 過濾與查詢
Pandas Series 是一個一維的標籤資料結構,類別似於一維陣列,但每個元素都有一個對應的索引標籤。過濾和查詢是資料分析中非常重要的步驟,Pandas Series 提供了多種方法來實作這些功能。
使用布林值過濾
布林值過濾是一種常見的過濾方法,透過建立一個布林值序列來選擇滿足條件的元素。例如:
import pandas as pd
# 建立一個 Pandas Series
my_list = [11, 12, 13, 14, 15]
my_series = pd.Series(my_list, index=['r', 's', 't', 'u', 'v'])
# 建立一個布林值序列
my_bool_filter = my_series > 13
# 過濾 Series
my_filtered_series = my_series[my_bool_filter]
print(my_filtered_series)
輸出:
u 14
v 15
dtype: int64
在這個例子中,我們建立了一個布林值序列 my_bool_filter
,其中只有大於 13 的元素為 True。然後,我們使用這個布林值序列來過濾原始 Series,得到一個新的 Series my_filtered_series
。
使用可呼叫物件過濾
可呼叫物件是一種特殊的物件,可以被用作函式。Pandas Series 支援使用可呼叫物件來過濾元素。例如:
import pandas as pd
# 建立一個 Pandas Series
my_list = [11, 12, 13, 14, 15]
my_series = pd.Series(my_list, index=['r', 's', 't', 'u', 'v'])
# 定義一個可呼叫物件
def filter_func(x):
return x > 13
# 過濾 Series
my_filtered_series = my_series[filter_func]
print(my_filtered_series)
輸出:
u 14
v 15
dtype: int64
在這個例子中,我們定義了一個可呼叫物件 filter_func
,它接收一個元素並傳回一個布林值。然後,我們使用這個可呼叫物件來過濾原始 Series,得到一個新的 Series my_filtered_series
。
使用 loc 和 iloc 過濾
Pandas Series 也支援使用 loc
和 iloc
來過濾元素。loc
是根據標籤的索引,而 iloc
是根據位置的索引。例如:
import pandas as pd
# 建立一個 Pandas Series
my_list = [11, 12, 13, 14, 15]
my_series = pd.Series(my_list, index=['r', 's', 't', 'u', 'v'])
# 使用 loc 過濾
my_filtered_series = my_series.loc[my_series > 13]
print(my_filtered_series)
輸出:
u 14
v 15
dtype: int64
在這個例子中,我們使用 loc
來過濾原始 Series,得到一個新的 Series my_filtered_series
。
內容解密:
在上面的例子中,我們使用了不同的方法來過濾 Pandas Series。布林值過濾是一種常見的方法,透過建立一個布林值序列來選擇滿足條件的元素。可呼叫物件過濾是一種特殊的方法,透過定義一個可呼叫物件來過濾元素。loc
和 iloc
是根據標籤和位置的索引方法,可以用來過濾元素。
圖表翻譯:
flowchart TD A[原始 Series] --> B[布林值過濾] B --> C[過濾後 Series] A --> D[可呼叫物件過濾] D --> C A --> E[loc 過濾] E --> C A --> F[iloc 過濾] F --> C
在這個圖表中,我們展示了不同的過濾方法,包括布林值過濾、可呼叫物件過濾、loc
過濾和 iloc
過濾。每個方法都可以用來過濾原始 Series,得到一個新的 Series。
使用 Pandas 過濾資料
問題描述
在 Pandas 中,我們可以使用多種方法來過濾資料。下面,我們將介紹四種不同的方法來過濾資料。
方法一:使用列表過濾
import pandas as pd
# 建立一個 Series
mypd_series = pd.Series([i for i in range(10)])
# 定義一個函式來過濾偶數
def my_even_number_selection(myseries):
return [True if i % 2 == 0 else False for i in range(myseries.size)]
print("方法一--------------------------")
print(mypd_series[my_even_number_selection(mypd_series)])
方法二:使用 loc 和 lambda 過濾
print("方法二--------------------------")
print(mypd_series.loc[lambda myseries: [True if i % 2 == 0 else False for i in range(myseries.size)]])
方法三:使用 iloc 和 lambda 過濾
print("方法三--------------------------")
print(mypd_series.iloc[lambda myseries: [True if i % 2 == 0 else False for i in range(myseries.size)]])
方法四:使用布林索引過濾
print("方法四--------------------------")
print(mypd_series[mypd_series % 2 == 0])
內容解密:
上述四種方法都可以用來過濾 Pandas 中的資料。方法一使用列表過濾,方法二和方法三使用 loc 和 iloc 來過濾,方法四使用布林索引過濾。這些方法都可以根據條件來過濾資料。
圖表翻譯:
flowchart TD A[建立 Series] --> B[定義過濾函式] B --> C[使用列表過濾] C --> D[使用 loc 和 lambda 過濾] D --> E[使用 iloc 和 lambda 過濾] E --> F[使用布林索引過濾] F --> G[輸出結果]
圖表說明:
上述流程圖展示了四種不同的方法來過濾 Pandas 中的資料。從建立 Series 到輸出結果,每一步都展示了不同的過濾方法。
使用 Pandas 進行資料過濾
在 Pandas 中,我們可以使用各種方法來過濾資料。以下是三種不同的方法,展示如何從一個 Pandas Series 中選擇出索引為偶數的元素。
從使用者經驗視角來看,Matplotlib 的多圖表繪製功能及 Pandas 的 Series 資料結構,顯著提升了資料視覺化和操作的效率。分析段落中提供的程式碼範例,清晰地展示瞭如何運用 subplots
、Series
、索引器、布林遮罩等方法,實作多圖表繪製、資料存取、過濾和查詢等功能。技術限制深析顯示,使用索引方法時,若嘗試存取不存在的索引或標籤,會引發錯誤,但 get()
方法提供瞭解決方案。展望未來,Pandas 生態系統的持續發展,將進一步簡化資料處理流程,並推動更多創新應用。玄貓認為,熟練掌握這些工具和技巧,對於提升資料分析效率至關重要,值得資料科學領域的專業人士深入學習和應用。