Matplotlib 提供了 subplots 函式,可以方便地在一張圖表中繪製多個子圖,便於比較和分析不同資料集。Pandas Series 作為 Pandas 重要的資料結構之一,提供了一維標籤資料的操作功能,包含建立、索引、切片、過濾和查詢等。開發者可以根據需求,從列表、字典、NumPy 陣列或標量值建立 Series。理解 Series 的索引機制,包含使用標籤和位置索引,對於高效地存取和運算元據至關重要。使用 lociloc 和布林遮罩可以根據不同條件選取資料子集,方便進行資料分析和處理。此外,複製引數 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[顯示圖表]

這個流程圖展示了建立多個子圖的步驟,從建立資料到顯示圖表。

重點回顧

  • 條形圖可以用於比較不同類別的值,包括垂直和水平條形圖。
  • 餅圖適合顯示類別資料的相對比例。
  • 散點圖用於視覺化兩個連續變數之間的關係。
  • 直方圖用於視覺化連續資料的分佈。
  • 子圖允許在單個圖表中繪製多個圖。

問題與練習

  1. 如何在Python中建立一個垂直條形圖?
  2. 如何在條形圖中為條形新增標籤?
  3. 什麼是水平條形圖和堆積疊條形圖?如何在Python中建立它們?
  4. 給出一個垂直堆積疊條形圖的例子。
  5. 給出一個水平堆積疊條形圖的例子。
  6. 如何在Python中建立一個分組條形圖(叢集條形圖)?
  7. 如何在Python中建立一個餅圖?
  8. 什麼是直方圖?如何在Python中建立一個直方圖?
  9. 如何在Python中建立一個散點圖?
  10. 什麼是子圖?如何在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 開始,因此輸出中顯示的索引標籤為 01234。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 的結構,其中索引標籤為 01234,值為 [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

內容解密:

  1. 資料型別指定:透過 dtype 引數,可以指定 Series 中元素的資料型別。在這個例子中,我們將 my_list 中的整數轉換為浮點數,以示範如何控制 Series 的資料型別。
  2. Series 名稱:使用 name 屬性,可以為 Series 賦予一個名稱。這個名稱將出現在輸出結果中,作為 Series 的標籤。
  3. 索引名稱:同樣地,使用 index.name 屬性,可以為 Series 的索引賦予一個名稱。這個名稱將出現在輸出結果中,作為索引的標籤。
  4. 輸出結果:最終輸出的 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=Falsecopy=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 引數為 FalseTrue

結果顯示,當 copy=False 時,對原始資料的修改會影響到複製品;而當 copy=True 時,對原始資料的修改不會影響到複製品。這是因為 copy=True 建立了一個完全獨立的記憶體空間,用於儲存複製品的資料。

因此,在進行資料操作時,瞭解 copy() 函式的作用和其引數 copy 的影響至關重要,以確保資料的正確性和安全性。

存取系列值:使用 headtail 方法

在 Pandas 中,headtail 方法分別用於存取系列(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

這些方法對於快速瀏覽和檢查你的資料非常有用,尤其是在處理大型資料集時。透過使用 headtail 方法,你可以輕鬆地檢視你的資料的開始和結束部分,從而更好地理解你的資料結構和內容。

存取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

從上述範例中,我們可以觀察到兩個重要點:

  1. 在根據標籤的切片中,結束/停止屬性是包含的,這就是為什麼我們可以看到索引標籤u被包含在內。
  2. 在根據索引的切片中,結束/停止屬性不包含,如果指定的話。這就是為什麼四不被包含在 [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提供了兩種索引器:locilocloc索引器使用標籤進行索引,而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,除非我們指定了預設值。接著,我們使用lociloc索引器存取系列中的值。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中,ilocloc是兩種不同方式來存取資料。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 中選擇值。這種方法適用於 ilocloc 和正常索引器。

基本概念

布林遮罩是指一個布林值的陣列,該陣列的每個元素對應於 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

布林遮罩也可以與 ilocloc 索引器一起使用。以下是範例:

# 使用 iloc 和布林遮罩
print(series.iloc[mask])

# 使用 loc 和布林遮罩
print(series.loc[mask])

這兩個範例都會產生相同的結果,因為 ilocloc 都支援布林遮罩。

使用布林值陣列進行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進行索引

除了使用布林值陣列進行索引外,您還可以使用ilocloc方法來選擇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中的元素將被選擇。然後,我們使用ilocloc方法來選擇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 也支援使用 lociloc 來過濾元素。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。布林值過濾是一種常見的方法,透過建立一個布林值序列來選擇滿足條件的元素。可呼叫物件過濾是一種特殊的方法,透過定義一個可呼叫物件來過濾元素。lociloc 是根據標籤和位置的索引方法,可以用來過濾元素。

圖表翻譯:

  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 資料結構,顯著提升了資料視覺化和操作的效率。分析段落中提供的程式碼範例,清晰地展示瞭如何運用 subplotsSeries、索引器、布林遮罩等方法,實作多圖表繪製、資料存取、過濾和查詢等功能。技術限制深析顯示,使用索引方法時,若嘗試存取不存在的索引或標籤,會引發錯誤,但 get() 方法提供瞭解決方案。展望未來,Pandas 生態系統的持續發展,將進一步簡化資料處理流程,並推動更多創新應用。玄貓認為,熟練掌握這些工具和技巧,對於提升資料分析效率至關重要,值得資料科學領域的專業人士深入學習和應用。