第二篇:數據表格的魔法:Python Pandas DataFrame 詳解 (Pandas 基礎篇)
開篇提問:
回憶一下,我們上一篇文章學習了 Pandas 的一維數據結構 Series,它可以看作是帶 “標簽” 的列表。 但現實世界中的數據,往往更加 結構化、多維度。 例如,一個 學生信息表,包含姓名、年齡、性別、班級、各科成績等多列信息;一個 產品銷售報表,包含產品名稱、類別、銷售地區、銷售額、利潤等多列數據。 這些數據用 Excel 表格來表示非常直觀和方便。
在 Pandas 中,處理這種 二維表格型數據 的 “魔法棒” 就是 DataFrame。 DataFrame 可以說是 Pandas 的 核心數據結構,也是進行數據分析的 主力工具。 它就像一個 “萬能的數據表格”,可以容納各種類型的數據,并提供強大的功能來 查詢、處理、分析 這些數據。 今天,就讓我們一起深入探索 Pandas DataFrame 的奧秘,掌握數據表格的魔法!
核心概念講解 (費曼式解釋):
-
Pandas DataFrame: 二維 “數據表格” (Excel 的 Python 升級版)
Pandas DataFrame 是一個 二維的、表格型的數據結構。 你可以把它想象成 Excel 表格 或 SQL 數據庫中的表。 DataFrame 由 行和列 組成,每一列可以是不同的數據類型 (例如數值、字符串、布爾值等)。 DataFrame 非常適合 表示結構化數據,例如 CSV 文件、Excel 文件、數據庫表格等。
-
DataFrame 的構成: 行索引 (Index) + 列索引 (Columns) + 數據 (Values)
一個 Pandas DataFrame 對象由 三部分組成:
- 行索引 (Index): DataFrame 的 行標簽,用于 唯一標識每一行數據。 行索引類似于 Excel 表格中的 行號,或者 SQL 表格中的 主鍵。 DataFrame 的行索引可以是 整數、字符串、日期時間 等類型,默認情況下,Pandas 會自動創建從 0 開始的整數索引。
- 列索引 (Columns): DataFrame 的 列標簽,用于 標識每一列數據,也就是 列名。 列索引通常是 字符串類型,DataFrame 通過列索引來訪問和操作數據列。 列索引 類似于 Excel 表格中的列頭,或者 SQL 表格中的 字段名。
- 數據 (Values): DataFrame 中 存儲的實際數據,是一個 二維的 NumPy 數組。 DataFrame 的數據 類似于 Excel 表格中的數據區域,或者 SQL 表格中的 數據行。
你可以把 Pandas DataFrame 想象成 帶 “行標簽” 和 “列標簽” 的 NumPy 二維數組,或者 更強大的 Python 版 Excel 表格。 DataFrame 的 行索引和列索引 讓數據 更結構化,更易于理解和操作。
-
DataFrame 與 Excel 表格的對比:
特性 Pandas DataFrame Excel 表格 數據結構 二維表格型數據結構 (內存中的對象) 二維表格型數據 (文件或內存中的對象) 數據處理 Python 代碼編程,高效、靈活、自動化 手動操作,點擊拖拽,操作繁瑣,自動化程度低 數據量 輕松處理 GB 甚至 TB 級別大數據 處理百萬行級別數據開始緩慢卡頓 功能 強大的數據分析和處理功能,遠超 Excel 基本的數據管理和簡單分析功能,功能有限 可擴展性 Python 生態系統,可與各種庫無縫集成,功能無限擴展 獨立軟件,功能擴展性有限 代碼復用 Python 代碼易于復用、版本控制和維護 手動操作步驟難以復用和版本控制 適用場景 各種復雜數據分析、數據科學、機器學習任務 簡單數據管理、報表制作、少量數據分析 -
創建 Pandas DataFrame:
pd.DataFrame()
可以使用
pd.DataFrame()
函數來 創建 Pandas DataFrame。pd.DataFrame()
函數可以從 字典 (dict)、列表字典、NumPy 二維數組 (ndarray) 等多種數據類型創建 DataFrame。-
從 Python 字典創建 DataFrame (字典的鍵作為列索引,值作為列數據):
import pandas as pd# 從 Python 字典創建 DataFrame data_dict = {'Name': ['Alice', 'Bob', 'Charlie', 'David'], # 姓名列數據 (列表)'Age': [25, 30, 28, 35], # 年齡列數據 (列表)'City': ['New York', 'London', 'Paris', 'Tokyo'] # 城市列數據 (列表) } # 字典數據,鍵為列名,值為列數據列表 df1 = pd.DataFrame(data_dict) # 從字典創建 DataFrame,字典的鍵作為列索引 print("從字典創建的 DataFrame:\n", df1) print("\nDataFrame 的列索引 (df1.columns):\n", df1.columns) # 列索引 (Index 對象,列名) print("\nDataFrame 的行索引 (df1.index):\n", df1.index) # 默認 RangeIndex (整數索引) print("\nDataFrame 的值 (df1.values):\n", df1.values) # 二維 NumPy 數組 print("\nDataFrame 的數據類型 (df1.dtypes):\n", df1.dtypes) # 每列的數據類型
-
從列表字典創建 DataFrame (列表中的每個字典作為一行數據):
import pandas as pd# 從列表字典創建 DataFrame data_list_dict = [{'Name': 'Alice', 'Age': 25, 'City': 'New York'}, # 字典表示第一行數據{'Name': 'Bob', 'Age': 30, 'City': 'London'}, # 字典表示第二行數據{'Name': 'Charlie', 'Age': 28, 'City': 'Paris'} # 字典表示第三行數據 ] # 列表字典數據,每個字典代表一行數據,鍵為列名,值為單元格數據 df2 = pd.DataFrame(data_list_dict) # 從列表字典創建 DataFrame print("\n從列表字典創建的 DataFrame:\n", df2) print("\nDataFrame 的列索引 (df2.columns):\n", df2.columns) # 列索引 (Index 對象,列名) print("\nDataFrame 的行索引 (df2.index):\n", df2.index) # 默認 RangeIndex (整數索引) print("\nDataFrame 的值 (df2.values):\n", df2.values) print("\nDataFrame 的數據類型 (df2.dtypes):\n", df2.dtypes)
-
從 NumPy 二維數組創建 DataFrame (需要指定列索引):
import pandas as pd import numpy as np# 從 NumPy 二維數組創建 DataFrame data_numpy_2d = np.array([['Alice', 25, 'New York'], # NumPy 數組表示數據行['Bob', 30, 'London'],['Charlie', 28, 'Paris'] ]) # NumPy 二維數組數據 column_names = ['Name', 'Age', 'City'] # 列名列表 (作為列索引) df3 = pd.DataFrame(data_numpy_2d, columns=column_names) # 從 NumPy 數組創建 DataFrame,指定列索引 print("\n從 NumPy 二維數組創建的 DataFrame:\n", df3) print("\nDataFrame 的列索引 (df3.columns):\n", df3.columns) # 列索引 (Index 對象,列名) print("\nDataFrame 的行索引 (df3.index):\n", df3.index) # 默認 RangeIndex (整數索引) print("\nDataFrame 的值 (df3.values):\n", df3.values) print("\nDataFrame 的數據類型 (df3.dtypes):\n", df3.dtypes) # 注意: 從 NumPy 數組創建的 DataFrame,如果數據類型不一致,可能會被轉換為 object 類型
代碼解釋:
pd.DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)
:pd.DataFrame()
函數的主要參數:data
: 數據源,可以是 字典、列表字典、NumPy 二維數組、Series 等。 如果 data 為字典,則字典的鍵會作為 DataFrame 的列索引,字典的值 (列表或 Series) 會作為 DataFrame 的列數據。 如果 data 為列表字典,則列表中的每個字典會作為 DataFrame 的一行數據,字典的鍵會作為列索引,字典的值會作為單元格數據。 如果 data 為 NumPy 二維數組,則需要使用columns
參數指定列索引。index
: 行索引,可以是 列表、NumPy 數組、Index 對象。 如果 不指定 index,Pandas 會自動創建默認的整數索引 (RangeIndex)。 行索引的長度必須與數據行數一致。columns
: 列索引,可以是 列表、NumPy 數組、Index 對象。 如果 不指定 columns,并且 data 是字典或列表字典,則列索引會自動從字典的鍵中提取。 如果 data 是 NumPy 二維數組,則必須手動指定 columns,列索引的長度必須與數據列數一致。dtype
: 數據類型,用于 指定 DataFrame 的數據類型。 如果不指定,Pandas 會 自動推斷數據類型。 可以指定整個 DataFrame 的數據類型,或者 按列指定數據類型 (字典形式)。copy=False
: 是否 復制數據,默認為False
(不復制,使用視圖)。 設置為True
則復制數據。
-
-
-
DataFrame 的基本操作: “查看表格的 “概況””
創建 DataFrame 后,我們通常需要先 查看 DataFrame 的基本信息,了解數據的 整體結構、數據類型、缺失值情況 等,為后續的數據分析做好準備。 Pandas 提供了多種方法來查看 DataFrame 的 “概況”:
-
.info()
: 查看 DataFrame 的總體信息 (索引、列、數據類型、內存占用等).info()
方法可以 打印 DataFrame 的簡潔摘要信息,包括 DataFrame 的索引類型、列名和數據類型、非空值數量、內存占用 等。.info()
是 快速了解 DataFrame 結構和數據質量 的重要工具。import pandas as pd# 創建一個 DataFrame (示例數據) data = {'col1': [1, 2, None, 4], 'col2': ['A', 'B', 'C', 'D'], 'col3': [True, False, True, False]} df = pd.DataFrame(data)# 使用 .info() 查看 DataFrame 信息 print("DataFrame 信息 (df.info()):") df.info() # 打印 DataFrame 的信息摘要
-
.describe()
: 查看數值列的統計摘要 (計數、均值、標準差、最小值、四分位數、最大值).describe()
方法可以 生成 DataFrame 數值列的描述性統計信息摘要,包括 計數 (count)、均值 (mean)、標準差 (std)、最小值 (min)、四分位數 (25%, 50%, 75%)、最大值 (max) 等。.describe()
可以 快速了解數值列的數據分布和統計特征。 默認情況下,.describe()
只統計數值列。 可以通過include='all'
參數來統計所有列 (包括非數值列)。import pandas as pd# 創建一個 DataFrame (示例數據) data = {'col1': [1, 2, 3, 4, 5], 'col2': [10, 20, 30, 40, 50], 'col3': ['A', 'B', 'C', 'D', 'E']} df = pd.DataFrame(data)# 使用 .describe() 查看數值列的統計摘要 print("\n數值列的統計摘要 (df.describe()):\n", df.describe()) # 默認只統計數值列 (col1, col2)# 統計所有列 (包括非數值列) 的摘要信息 (include='all') print("\n所有列的統計摘要 (df.describe(include='all')):\n", df.describe(include='all')) # include='all' 統計所有列,非數值列會顯示 count, unique, top, freq 等統計信息
-
.head(n)
: 查看 DataFrame 的前n
行 (默認前 5 行).head(n)
方法可以 返回 DataFrame 的前n
行數據,用于 快速查看 DataFrame 的數據樣例,了解數據的大致內容和格式。 默認顯示前 5 行,可以自定義n
的值來顯示更多或更少的行數。import pandas as pd# 創建一個 DataFrame (示例數據,假設有很多行) data = {'col1': range(1, 21), 'col2': range(10, 30)} # 創建 20 行數據 df = pd.DataFrame(data)# 使用 .head() 查看 DataFrame 的前幾行 print("\nDataFrame 的前 5 行 (df.head()):\n", df.head()) # 默認顯示前 5 行print("\nDataFrame 的前 10 行 (df.head(10)):\n", df.head(10)) # 顯示前 10 行
-
.tail(n)
: 查看 DataFrame 的后n
行 (默認后 5 行).tail(n)
方法可以 返回 DataFrame 的后n
行數據,與.head(n)
類似,用于 查看 DataFrame 尾部的數據樣例。 默認顯示后 5 行,可以自定義n
的值。import pandas as pd# ... (使用上面的 df) ...# 使用 .tail() 查看 DataFrame 的后幾行 print("\nDataFrame 的后 5 行 (df.tail()):\n", df.tail()) # 默認顯示后 5 行print("\nDataFrame 的后 3 行 (df.tail(3)):\n", df.tail(3)) # 顯示后 3 行
-
.sample(n)
: 隨機抽樣查看 DataFrame 的n
行數據 (默認隨機抽樣 1 行).sample(n)
方法可以 從 DataFrame 中隨機抽取n
行數據,用于 隨機查看 DataFrame 的數據樣例,了解數據的隨機分布情況。 默認隨機抽樣 1 行,可以自定義n
的值來抽樣更多行數。import pandas as pd# ... (使用上面的 df) ...# 使用 .sample() 隨機抽樣查看 DataFrame 數據 print("\nDataFrame 隨機抽樣 1 行 (df.sample()):\n", df.sample()) # 默認隨機抽樣 1 行,每次運行結果可能不一樣print("\nDataFrame 隨機抽樣 5 行 (df.sample(5)):\n", df.sample(5)) # 隨機抽樣 5 行,每次運行結果可能不一樣
-
.shape
: 查看 DataFrame 的形狀 (行數和列數).shape
屬性可以 返回 DataFrame 的形狀,也就是 行數和列數,以 元組(rows, columns)
形式返回。.shape
屬性可以 快速了解 DataFrame 的數據規模。import pandas as pd# ... (使用上面的 df) ...# 使用 .shape 查看 DataFrame 的形狀 print("\nDataFrame 的形狀 (df.shape):\n", df.shape) # (20, 2) 表示 20 行 2 列
-
.dtypes
: 查看 DataFrame 每列的數據類型.dtypes
屬性可以 返回一個 Series,包含 DataFrame 每列的數據類型。.dtypes
可以 快速了解 DataFrame 各列的數據類型,方便后續的數據處理和分析。import pandas as pd# ... (使用上面的 df) ...# 使用 .dtypes 查看 DataFrame 每列的數據類型 print("\nDataFrame 每列的數據類型 (df.dtypes):\n", df.dtypes) # col1 int64, col2 int64, dtype: object (Series 類型)
-
.index
: 查看 DataFrame 的行索引.index
屬性可以 返回 DataFrame 的行索引對象。 行索引用于 標識和訪問 DataFrame 的行數據。import pandas as pd# ... (使用上面的 df) ...# 使用 .index 查看 DataFrame 的行索引 print("\nDataFrame 的行索引 (df.index):\n", df.index) # RangeIndex(start=0, stop=20, step=1)
-
.columns
: 查看 DataFrame 的列索引 (列名).columns
屬性可以 返回 DataFrame 的列索引對象。 列索引用于 標識和訪問 DataFrame 的列數據。import pandas as pd# ... (使用上面的 df) ...# 使用 .columns 查看 DataFrame 的列索引 (列名) print("\nDataFrame 的列索引 (df.columns):\n", df.columns) # Index(['col1', 'col2'], dtype='object')
-
.values
: 查看 DataFrame 的值 (NumPy 二維數組).values
屬性可以 返回 DataFrame 的值,以 NumPy 二維數組形式返回。.values
可以將 DataFrame 數據轉換為 NumPy 數組,方便進行 NumPy 的數值計算和操作。import pandas as pd# ... (使用上面的 df) ...# 使用 .values 查看 DataFrame 的值 (NumPy 二維數組) print("\nDataFrame 的值 (df.values):\n", df.values) # 返回 NumPy 二維數組 print("\nDataFrame 的值的數據類型 (df.values.dtype):\n", df.values.dtype) # int64 (NumPy 數組的數據類型)
-
-
DataFrame 的數據選擇: “精準定位,提取數據子集”
DataFrame 提供了靈活強大的數據選擇方法,可以 根據列名、行索引、切片、條件表達式 等多種方式,精準地提取 DataFrame 中的數據子集。 數據選擇是 DataFrame 操作的 核心技能,也是進行數據分析的基礎。
-
列選擇 (Column Selection): “選擇你需要的列”
-
選擇單列:
df['列名']
或df.列名
(返回 Series)可以使用 列名字符串 作為鍵,通過 字典式索引
df['列名']
或 屬性訪問方式df.列名
來 選擇 DataFrame 的單列數據。 返回的是 Pandas Series 對象。 注意: 屬性訪問方式df.列名
只在列名符合 Python 變量命名規范時有效 (例如不包含空格、特殊字符等)。import pandas as pd# 創建一個 DataFrame (示例數據) data = {'Name': ['Alice', 'Bob', 'Charlie'], 'Age': [25, 30, 28], 'City': ['New York', 'London', 'Paris']} df = pd.DataFrame(data) print("DataFrame:\n", df)# 1. 使用字典式索引選擇單列 ('Age' 列) age_column_series_1 = df['Age'] # 選擇 'Age' 列,返回 Series print("\n選擇 'Age' 列 (字典式索引 df['Age']):\n", age_column_series_1) print("選擇的列的數據類型:", type(age_column_series_1)) # <class 'pandas.core.series.Series'># 2. 使用屬性訪問方式選擇單列 ('Name' 列) name_column_series_2 = df.Name # 選擇 'Name' 列,返回 Series (列名符合變量命名規范) print("\n選擇 'Name' 列 (屬性訪問方式 df.Name):\n", name_column_series_2) print("選擇的列的數據類型:", type(name_column_series_2)) # <class 'pandas.core.series.Series'>
-
選擇多列:
df[['列名1', '列名2', ...]]
(返回 DataFrame)可以使用 列名列表 作為鍵,通過 字典式索引
df[['列名1', '列名2', ...]]
來 選擇 DataFrame 的多列數據。 返回的是 Pandas DataFrame 對象,包含選擇的列。 注意: 列名列表需要用 兩層方括號[[...]]
括起來,外層方括號表示索引操作,內層方括號表示列名列表。import pandas as pd# ... (使用上面的 df) ...# 選擇多列 (['Name', 'City'] 列) subset_df_columns = df[['Name', 'City']] # 選擇 'Name' 和 'City' 列,返回 DataFrame print("\n選擇多列 (['Name', 'City'] 列,df[['Name', 'City']]):\n", subset_df_columns) print("選擇的多列的數據類型:", type(subset_df_columns)) # <class 'pandas.core.frame.DataFrame'>
-
-
行選擇 (Row Selection): “選擇你需要的行”
DataFrame 的行選擇主要使用 基于標簽的
.loc[]
和 基于位置的.iloc[]
兩種索引器,以及 切片 和 條件表達式 等方法。-
基于標簽的行選擇:
.loc[]
(根據行索引標簽選擇).loc[]
索引器 基于行索引標簽 進行行選擇。 可以使用 單個標簽、標簽列表、標簽切片 等方式來選擇行。.loc[]
是 “label-based” 的,包含結束標簽。import pandas as pd# 創建一個 DataFrame,自定義行索引 (標簽) data = {'col1': [1, 2, 3], 'col2': ['A', 'B', 'C']} index_labels = ['row1', 'row2', 'row3'] # 自定義行索引標簽 df = pd.DataFrame(data, index=index_labels) print("DataFrame (自定義行索引):\n", df)# 1. 選擇單行 (根據行索引標簽 'row2') row_series_loc_single = df.loc['row2'] # 選擇行索引為 'row2' 的行,返回 Series print("\n選擇單行 (df.loc['row2']):\n", row_series_loc_single) print("選擇的行的數據類型:", type(row_series_loc_single)) # <class 'pandas.core.series.Series'># 2. 選擇多行 (根據行索引標簽列表 ['row1', 'row3']) subset_df_loc_list = df.loc[['row1', 'row3']] # 選擇行索引為 ['row1', 'row3'] 的多行,返回 DataFrame print("\n選擇多行 (df.loc[['row1', 'row3']]):\n", subset_df_loc_list) print("選擇的多行的數據類型:", type(subset_df_loc_list)) # <class 'pandas.core.frame.DataFrame'># 3. 選擇連續多行 (根據行索引標簽切片 'row1':'row3') subset_df_loc_slice = df.loc['row1':'row3'] # 選擇行索引標簽為 'row1' 到 'row3' (包含 'row3') 的連續多行,返回 DataFrame print("\n選擇連續多行 (df.loc['row1':'row3']):\n", subset_df_loc_slice) # 注意: 標簽切片是包含結束標簽的! print("選擇的連續多行的數據類型:", type(subset_df_loc_slice)) # <class 'pandas.core.frame.DataFrame'>
-
基于位置的行選擇:
.iloc[]
(根據行位置索引選擇).iloc[]
索引器 基于行位置索引 (整數索引) 進行行選擇。 可以使用 整數索引、整數索引列表、整數索引切片 等方式來選擇行。.iloc[]
是 “integer-location based” 的,不包含結束位置。.iloc[]
的用法與 NumPy 數組的整數索引和切片非常相似。import pandas as pd# ... (使用上面的 df,自定義行索引的 DataFrame) ...# 1. 選擇單行 (根據行位置索引 1,即第二行) row_series_iloc_single = df.iloc[1] # 選擇行位置索引為 1 的行 (第二行),返回 Series print("\n選擇單行 (df.iloc[1]):\n", row_series_iloc_single) print("選擇的行的數據類型:", type(row_series_iloc_single)) # <class 'pandas.core.series.Series'># 2. 選擇多行 (根據行位置索引列表 [0, 2],即第一行和第三行) subset_df_iloc_list = df.iloc[[0, 2]] # 選擇行位置索引為 [0, 2] 的多行,返回 DataFrame print("\n選擇多行 (df.iloc[[0, 2]]):\n", subset_df_iloc_list) print("選擇的多行的數據類型:", type(subset_df_iloc_list)) # <class 'pandas.core.frame.DataFrame'># 3. 選擇連續多行 (根據行位置索引切片 0:3,即前三行) subset_df_iloc_slice = df.iloc[0:3] # 選擇行位置索引為 0 到 3 (不包含 3) 的連續多行,返回 DataFrame print("\n選擇連續多行 (df.iloc[0:3]):\n", subset_df_iloc_slice) # 注意: 位置索引切片是不包含結束位置的! print("選擇的連續多行的數據類型:", type(subset_df_iloc_slice)) # <class 'pandas.core.frame.DataFrame'>
-
行切片 (Row Slicing): “選擇連續的行”
可以直接使用 切片語法
df[start:stop:step]
對 DataFrame 進行 行切片,根據行位置索引 (整數索引) 選擇連續的行。 行切片與.iloc[]
的整數索引切片類似,但不完全相同。 行切片是 “position-based” 的,不包含結束位置。 注意: 行切片不能使用行索引標簽,只能使用行位置索引。import pandas as pd# ... (使用上面的 df,自定義行索引的 DataFrame) ...# 使用行切片選擇前兩行 (位置索引 0:2) subset_df_row_slice = df[0:2] # 選擇行位置索引為 0 到 2 (不包含 2) 的前兩行,返回 DataFrame print("\n行切片選擇前兩行 (df[0:2]):\n", subset_df_row_slice) # 注意: 行切片是不包含結束位置的! print("選擇的行切片的數據類型:", type(subset_df_row_slice)) # <class 'pandas.core.frame.DataFrame'># 注意: 行切片不能使用行索引標簽,會報錯 KeyError # subset_df_row_slice_label = df['row1':'row3'] # KeyError: 'row1:row3' # 錯誤! 行切片不能使用標簽切片!
-
-
行列同時選擇 (Row and Column Selection): “行列 “坐標” 定位”
可以 組合行選擇和列選擇,同時選擇指定的行和列,提取 DataFrame 的 數據子集。 常用的行列同時選擇方法包括:
-
.loc[行索引, 列索引]
: 基于標簽的行列選擇.loc[]
索引器可以 同時接收行索引和列索引,使用 標簽 進行行列選擇。 行列索引都可以是 單個標簽、標簽列表、標簽切片。import pandas as pd# ... (使用上面自定義行索引的 DataFrame df) ...# 1. 選擇指定行和指定列的單個單元格 (根據標簽 'row2' 和 'col1') cell_value_loc_single = df.loc['row2', 'col1'] # 選擇行索引為 'row2',列索引為 'col1' 的單元格值 print("\n選擇單個單元格 (df.loc['row2', 'col1']):\n", cell_value_loc_single) # 3# 2. 選擇指定行和多列 (行標簽 'row2',列標簽列表 ['col1', 'col2']) row_series_loc_multi_cols = df.loc['row2', ['col1', 'col2']] # 選擇行索引為 'row2',列索引為 ['col1', 'col2'] 的數據,返回 Series print("\n選擇指定行和多列 (df.loc['row2', ['col1', 'col2']]):\n", row_series_loc_multi_cols)# 3. 選擇多行和指定列 (行標簽列表 ['row1', 'row3'],列標簽 'col2') col_series_loc_multi_rows = df.loc[['row1', 'row3'], 'col2'] # 選擇行索引為 ['row1', 'row3'],列索引為 'col2' 的數據,返回 Series print("\n選擇多行和指定列 (df.loc[['row1', 'row3'], 'col2']):\n", col_series_loc_multi_rows)# 4. 選擇多行和多列 (行標簽切片 'row1':'row3',列標簽列表 ['col1', 'col2']) subset_df_loc_multi_rows_cols = df.loc['row1':'row3', ['col1', 'col2']] # 選擇行索引標簽為 'row1' 到 'row3',列索引為 ['col1', 'col2'] 的數據,返回 DataFrame print("\n選擇多行和多列 (df.loc['row1':'row3', ['col1', 'col2']]):\n", subset_df_loc_multi_rows_cols)
-
.iloc[行位置索引, 列位置索引]
: 基于位置的行列選擇.iloc[]
索引器可以 同時接收行位置索引和列位置索引,使用 整數索引 進行行列選擇。 行列位置索引都可以是 整數索引、整數索引列表、整數索引切片。import pandas as pd# ... (使用上面自定義行索引的 DataFrame df) ...# 1. 選擇指定行和指定列的單個單元格 (根據位置索引 [1, 0],即第二行第一列) cell_value_iloc_single = df.iloc[1, 0] # 選擇行位置索引為 1,列位置索引為 0 的單元格值 print("\n選擇單個單元格 (df.iloc[1, 0]):\n", cell_value_iloc_single) # 2# 2. 選擇指定行和多列 (行位置索引 1,列位置索引列表 [0, 1]) row_series_iloc_multi_cols = df.iloc[1, [0, 1]] # 選擇行位置索引為 1,列位置索引為 [0, 1] 的數據,返回 Series print("\n選擇指定行和多列 (df.iloc[1, [0, 1]]):\n", row_series_iloc_multi_cols)# 3. 選擇多行和指定列 (行位置索引列表 [0, 2],列位置索引 1) col_series_iloc_multi_rows = df.iloc[[0, 2], 1] # 選擇行位置索引為 [0, 2],列位置索引為 1 的數據,返回 Series print("\n選擇多行和指定列 (df.iloc[[0, 2], 1]):\n", col_series_iloc_multi_rows)# 4. 選擇多行和多列 (行位置索引切片 0:3,列位置索引切片 0:2) subset_df_iloc_multi_rows_cols = df.iloc[0:3, 0:2] # 選擇行位置索引為 0 到 3,列位置索引為 0 到 2 的數據,返回 DataFrame print("\n選擇多行和多列 (df.iloc[0:3, 0:2]):\n", subset_df_iloc_multi_rows_cols)
-
-
-
案例應用: 用 Pandas DataFrame 表示學生信息表
我們來做一個案例應用,展示如何使用 Pandas DataFrame 表示學生信息表,并進行基本的數據查看和選擇操作。 假設我們要創建一個學生信息表,包含姓名、年齡、班級、成績等信息。
import pandas as pd# 學生信息數據 (字典列表) student_data = [{'Name': 'Alice', 'Age': 18, 'Class': 'Class A', 'Score': 95},{'Name': 'Bob', 'Age': 19, 'Class': 'Class B', 'Score': 88},{'Name': 'Charlie', 'Age': 18, 'Class': 'Class A', 'Score': 92},{'Name': 'David', 'Age': 20, 'Class': 'Class C', 'Score': 75},{'Name': 'Eve', 'Age': 19, 'Class': 'Class B', 'Score': 90} ] # 列表字典數據# 創建 Pandas DataFrame 表示學生信息表 student_df = pd.DataFrame(student_data) print("學生信息表 (DataFrame):\n", student_df)# 1. 查看 DataFrame 的基本信息 print("\nDataFrame 信息 (student_df.info()):") student_df.info()# 2. 查看數值列的統計摘要 print("\n數值列的統計摘要 (student_df.describe()):\n", student_df.describe())# 3. 查看前 3 行數據 print("\n前 3 行數據 (student_df.head(3)):\n", student_df.head(3))# 4. 查看后 2 行數據 print("\n后 2 行數據 (student_df.tail(2)):\n", student_df.tail(2))# 5. 查看 'Name' 列和 'Score' 列 print("\n'Name' 列和 'Score' 列 (student_df[['Name', 'Score']]):\n", student_df[['Name', 'Score']])# 6. 選擇 'Class' 為 'Class A' 的學生信息 (布爾索引,后續文章講解) class_a_students_df = student_df[student_df['Class'] == 'Class A'] # 布爾索引篩選 (后續文章講解) print("\n'Class' 為 'Class A' 的學生信息 (student_df[student_df['Class'] == 'Class A']):\n", class_a_students_df)# 7. 選擇前兩行 (行切片) first_two_rows_df = student_df[0:2] # 行切片選擇前兩行 print("\n前兩行 (student_df[0:2]):\n", first_two_rows_df)# 8. 選擇第一行和第三行 (基于位置索引 .iloc[]) first_third_rows_df = student_df.iloc[[0, 2]] # 基于位置索引選擇第一行和第三行 print("\n第一行和第三行 (student_df.iloc[[0, 2]]):\n", first_third_rows_df)# 9. 選擇第一行和 'Name' 列、'Score' 列 (基于位置索引 .iloc[] 和列位置索引) first_row_name_score = student_df.iloc[0, [0, 3]] # 選擇第一行,'Name' 列和 'Score' 列 (列位置索引) print("\n第一行和 'Name' 列、'Score' 列 (student_df.iloc[0, [0, 3]]):\n", first_row_name_score)
代碼解釋:
- 用 DataFrame 表示學生信息表: 我們使用
pd.DataFrame()
創建了一個 Pandas DataFramestudent_df
,字典列表student_data
作為數據源,自動創建了列索引 (列名) 和默認整數行索引。 - DataFrame 基本操作演示: 案例代碼演示了如何使用
.info()
,.describe()
,.head()
,.tail()
, 列選擇, 行選擇 (切片,.iloc[]
), 行列同時選擇等基本操作,查看和提取 DataFrame 的數據子集。 布爾索引 (條件篩選) 在代碼中也有初步展示,會在后續文章中詳細講解。
- 用 DataFrame 表示學生信息表: 我們使用
費曼回顧 (知識鞏固):
現在,請你用自己的話,總結一下今天我們學習的 Pandas DataFrame 的知識,包括:
- 什么是 Pandas DataFrame? 它由哪三部分組成? 行索引 (Index)、列索引 (Columns) 和 值 (Values) 分別是什么意思? DataFrame 有什么特點和用途? DataFrame 與 Excel 表格有什么異同?
- 我們學習了哪些創建 Pandas DataFrame 的方法?
pd.DataFrame()
函數如何使用? 如何從字典、列表字典、NumPy 數組創建 DataFrame? 如何指定 DataFrame 的行索引和列索引? - 我們學習了哪些 DataFrame 的基本操作?
.info()
,.describe()
,.head()
,.tail()
,.sample()
,.shape
,.dtypes
,.index
,.columns
,.values
分別有什么作用? 如何使用它們查看 DataFrame 的基本信息和數據概況? - 我們學習了哪些 DataFrame 的數據選擇方法? 如何進行列選擇 (單列、多列)? 如何進行行選擇 (基于標簽
.loc[]
,基于位置.iloc[]
,切片)? 如何進行行列同時選擇? - 在學生信息表案例中,我們是如何使用 Pandas DataFrame 來表示數據,并進行基本的數據查看和選擇操作的?
嘗試用最簡潔、最形象的語言來解釋,就像你是一位數據分析老師,正在給你的學生講解一樣。 如果你能清晰地解釋出來,就說明你已經掌握了今天學習的內容!
課后思考 (拓展延伸):
- 嘗試修改學生信息表案例的代碼,例如:
- 增加更多學生數據,或者增加更多列 (例如添加 “出生日期”、“家庭住址” 等列),看看 DataFrame 如何處理更大規模、更復雜的數據?
- 嘗試使用不同的方法創建 DataFrame,例如從 CSV 文件讀取數據創建 DataFrame (提示:可以使用
pd.read_csv()
函數,我們會在下一篇文章中學習)? - 嘗試使用更復雜的數據選擇操作,例如選擇特定年齡段、特定班級的學生信息? 或者選擇特定行和特定列交叉區域的數據?
- 查閱 Pandas 文檔,了解更多 DataFrame 的屬性和方法,例如
.ndim
(維度),.size
(元素數量),.empty
(是否為空),.axes
(行索引和列索引列表) 等。
- 思考一下,除了學生信息表,Pandas DataFrame 還可以用來表示哪些二維表格型數據? 例如,產品銷售數據、股票交易數據、用戶行為日志等等。 你有什么有趣的應用想法嗎?
- 預習 Pandas 數據讀取和寫入的相關知識,為下一篇文章的學習做好準備。
恭喜你!完成了 Pandas 費曼學習法的第二篇文章學習! 你已經掌握了 Pandas 的核心數據結構 DataFrame 的基本概念、創建和操作方法,可以開始用 Pandas 處理結構化數據,告別 Excel 的 “低效時代” 了! 下一篇文章,我們將學習 Pandas 的 數據讀取和寫入 功能,掌握如何從各種文件格式 導入數據到 DataFrame,以及如何將 DataFrame 數據 導出到文件,讓你的數據分析流程更加完整和高效! 敬請期待!