費曼學習法13 - 數據表格的魔法:Python Pandas DataFrame 詳解 (Pandas 基礎篇)

第二篇:數據表格的魔法:Python Pandas DataFrame 詳解 (Pandas 基礎篇)

開篇提問:

回憶一下,我們上一篇文章學習了 Pandas 的一維數據結構 Series,它可以看作是帶 “標簽” 的列表。 但現實世界中的數據,往往更加 結構化、多維度。 例如,一個 學生信息表,包含姓名、年齡、性別、班級、各科成績等多列信息;一個 產品銷售報表,包含產品名稱、類別、銷售地區、銷售額、利潤等多列數據。 這些數據用 Excel 表格來表示非常直觀和方便。

在 Pandas 中,處理這種 二維表格型數據 的 “魔法棒” 就是 DataFrame。 DataFrame 可以說是 Pandas 的 核心數據結構,也是進行數據分析的 主力工具。 它就像一個 “萬能的數據表格”,可以容納各種類型的數據,并提供強大的功能來 查詢、處理、分析 這些數據。 今天,就讓我們一起深入探索 Pandas DataFrame 的奧秘,掌握數據表格的魔法!

核心概念講解 (費曼式解釋):

  1. 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 DataFrameExcel 表格
      數據結構二維表格型數據結構 (內存中的對象)二維表格型數據 (文件或內存中的對象)
      數據處理Python 代碼編程,高效、靈活、自動化手動操作,點擊拖拽,操作繁瑣,自動化程度低
      數據量輕松處理 GB 甚至 TB 級別大數據處理百萬行級別數據開始緩慢卡頓
      功能強大的數據分析和處理功能,遠超 Excel基本的數據管理和簡單分析功能,功能有限
      可擴展性Python 生態系統,可與各種庫無縫集成,功能無限擴展獨立軟件,功能擴展性有限
      代碼復用Python 代碼易于復用、版本控制和維護手動操作步驟難以復用和版本控制
      適用場景各種復雜數據分析、數據科學、機器學習任務簡單數據管理、報表制作、少量數據分析
    • 創建 Pandas DataFrame: pd.DataFrame()

      可以使用 pd.DataFrame() 函數來 創建 Pandas DataFramepd.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 則復制數據。
  2. 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 數組的數據類型)
      
  3. 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)
        
  4. 案例應用: 用 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 DataFrame student_df字典列表 student_data 作為數據源,自動創建了列索引 (列名) 和默認整數行索引。
    • DataFrame 基本操作演示: 案例代碼演示了如何使用 .info(), .describe(), .head(), .tail(), 列選擇, 行選擇 (切片, .iloc[]), 行列同時選擇等基本操作,查看和提取 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 來表示數據,并進行基本的數據查看和選擇操作的?

嘗試用最簡潔、最形象的語言來解釋,就像你是一位數據分析老師,正在給你的學生講解一樣。 如果你能清晰地解釋出來,就說明你已經掌握了今天學習的內容!

課后思考 (拓展延伸):

  1. 嘗試修改學生信息表案例的代碼,例如:
    • 增加更多學生數據,或者增加更多列 (例如添加 “出生日期”、“家庭住址” 等列),看看 DataFrame 如何處理更大規模、更復雜的數據?
    • 嘗試使用不同的方法創建 DataFrame,例如從 CSV 文件讀取數據創建 DataFrame (提示:可以使用 pd.read_csv() 函數,我們會在下一篇文章中學習)?
    • 嘗試使用更復雜的數據選擇操作,例如選擇特定年齡段、特定班級的學生信息? 或者選擇特定行和特定列交叉區域的數據?
    • 查閱 Pandas 文檔,了解更多 DataFrame 的屬性和方法,例如 .ndim (維度), .size (元素數量), .empty (是否為空), .axes (行索引和列索引列表) 等。
  2. 思考一下,除了學生信息表,Pandas DataFrame 還可以用來表示哪些二維表格型數據? 例如,產品銷售數據、股票交易數據、用戶行為日志等等。 你有什么有趣的應用想法嗎?
  3. 預習 Pandas 數據讀取和寫入的相關知識,為下一篇文章的學習做好準備。

恭喜你!完成了 Pandas 費曼學習法的第二篇文章學習! 你已經掌握了 Pandas 的核心數據結構 DataFrame 的基本概念、創建和操作方法,可以開始用 Pandas 處理結構化數據,告別 Excel 的 “低效時代” 了! 下一篇文章,我們將學習 Pandas 的 數據讀取和寫入 功能,掌握如何從各種文件格式 導入數據到 DataFrame,以及如何將 DataFrame 數據 導出到文件,讓你的數據分析流程更加完整和高效! 敬請期待!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/71344.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/71344.shtml
英文地址,請注明出處:http://en.pswp.cn/web/71344.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

一周學會Flask3 Python Web開發-在模板中渲染WTForms表單視圖函數里獲取表單數據

鋒哥原創的Flask3 Python Web開發 Flask3視頻教程&#xff1a; 2025版 Flask3 Python web開發 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili 為了能夠在模板中渲染表單&#xff0c;我們需要把表單類實例傳入模板。首先在視圖函數里實例化表單類LoginForm&#xff0c;然…

小紅書湖倉架構的躍遷之路

作者&#xff1a;李鵬霖(丁典)&#xff0c;小紅書-研發工程師&#xff0c;StarRocks Contributor & Apache Impala Committer 本文整理自小紅書工程師在 StarRocks 年度峰會上的分享&#xff0c;介紹了小紅書自助分析平臺中&#xff0c;StarRocks 與 Iceberg 結合后&#x…

數據結構第五節:排序

1.常見的排序算法 插入排序&#xff1a;直接插入排序、希爾排序 選擇排序&#xff1a;直接選擇排序、堆排序 交換排序&#xff1a;冒泡排序、快速排序 歸并排序&#xff1a;歸并排序 排序的接口實現&#xff1a; // 1. 直接插入排序 void InsertSort(int* a, int n); // 2. 希…

BambuStudio學習筆記:FaceDetector類

面檢測器類解析 這段代碼定義了一個名為 FaceDetector 的 C 類&#xff0c;用于處理三維模型中的面檢測。以下是該類的具體說明&#xff1a; 頭文件保護 #ifndef slic3r_FaceDetector_hpp_ #define slic3r_FaceDetector_hpp_這部分代碼防止頭文件被多次包含。 命名空間聲明…

C++發展

目錄 ?編輯C 的發展總結&#xff1a;?編輯 1. C 的早期發展&#xff08;1979-1985&#xff09; 2. C 標準化過程&#xff08;1985-1998&#xff09; 3. C 標準演化&#xff08;2003-2011&#xff09; 4. C11&#xff08;2011年&#xff09; 5. C14&#xff08;2014年&a…

LeetCode 21. 合并兩個有序鏈表(Python)

將兩個升序鏈表合并為一個新的 升序 鏈表并返回。新鏈表是通過拼接給定的兩個鏈表的所有節點組成的。 輸入&#xff1a;l1 [1,2,4], l2 [1,3,4] 輸出&#xff1a;[1,1,2,3,4,4] 示例 2&#xff1a; 輸入&#xff1a;l1 [], l2 [] 輸出&#xff1a;[] 示例 3&#xff1a; 輸…

FPGA 配置原理

用戶編程控制的FPGA 是通過加載比特位流配置內部的存儲單元實現的。該存儲單元就是所謂的配置單元&#xff0c;它必須在器件上電后進行配置&#xff0c;從而設置查找表&#xff08;LUT&#xff09;的屬性、連線方式、IOB 電壓標準和其它的用戶設計。 1.配置幀 以Xilinx 公司的…

測試人員如何更好的跟蹤BUG

軟件測試中BUG跟蹤是確保軟件質量的關鍵環節。測試人員不僅需要發現BUG&#xff0c;還需有效管理其狀態&#xff0c;從報告到修復驗證的全過程。如何更好地跟蹤BUG&#xff0c;成為測試人員提升效率的重要課題。本文將詳細探討測試人員可以采用的策略&#xff0c;包括使用工具、…

lamp平臺介紹

一、lamp介紹 網站&#xff1a; 靜態 動態 php語言 .php 作用&#xff1a;運行php語言編寫動態網站應用 lamp Linux Apache MySQL PHP PHP是作為httpd的一個功能模塊存在的 二、部署lamp平臺 1、測試httpd是否可正常返回PHP的響應 2、測試PHP代碼是否可正常連接數據…

2025年滲透測試面試題總結-字某跳動-滲透測試實習生(題目+回答)

網絡安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。 字某跳動-滲透測試實習生 滲透流程信息收集如何處理子域名爆破中的泛解析問題繞過CDN尋找真實IPPHPINFO頁面關注…

Spring Boot 自動裝配深度解析與實踐指南

目錄 引言&#xff1a;自動裝配如何重塑Java應用開發&#xff1f; 一、自動裝配核心機制 1.1 自動裝配三大要素 1.2 自動裝配流程 二、自定義自動配置實現 2.1 創建自動配置類 2.2 配置屬性綁定 2.3 注冊自動配置 三、條件注解深度應用 3.1 常用條件注解對比 3.2 自定…

《算法筆記》9.6小節 數據結構專題(2)并查集 問題 C: How Many Tables

題目描述 Today is Ignatius birthday. He invites a lot of friends. Now its dinner time. Ignatius wants to know how many tables he needs at least. You have to notice that not all the friends know each other, and all the friends do not want to stay with stra…

CPU、SOC、MPU、MCU--詳細分析四者的區別

一、CPU 與SOC的區別 1.CPU 對于電腦&#xff0c;我們經常提到&#xff0c;處理器&#xff0c;內存&#xff0c;顯卡&#xff0c;硬盤四大部分可以組成一個基本的電腦。其中的處理器——Central Processing Unit&#xff08;中央處理器&#xff09;。CPU是一臺計算機的運算核…

Linux常用指令學習筆記

文章目錄 前言一、文件和目錄操作指令1. 文件操作2. 目錄操作 二、文件權限管理三、網絡相關指令四、系統管理指令五、文本編輯器基本操作 六、壓縮和解壓指令七、總結 前言 在當今的IT領域&#xff0c;Linux系統因其開源、穩定、安全等特性&#xff0c;廣泛應用于服務器、個人…

android studio通過 jni 調用第三方非標準 so庫

調用第三方的so方法&#xff0c;但這個so內的方法不是標準的jni方法。這就需要我們自己寫jni然后鏈接到第三方so庫&#xff0c;通過jni調用so庫中的方法。 1.簡述&#xff1a; 要先有第三方的so庫.so文件和編譯庫對應的.h頭文件 我們自己用 c/c 創建一個標準的so 庫,比如 my…

Spring(三)容器-注入

一 自動注入Autowire 代碼實現&#xff1a; package org.example.spring01.service;import org.springframework.stereotype.Service;Service public class UserService {}package org.example.spring01.controller;import lombok.Data; import lombok.ToString; import org.…

mac上最好的Python開發環境之Anaconda+Pycharm

為了運行修改 label-studio項目源碼&#xff0c;又不想在windows上運行&#xff0c;便在mac上開始安裝&#xff0c;開始使用poetry安裝&#xff0c;各種報錯&#xff0c;不是zip包解壓不了&#xff0c;就是numpy編譯報錯&#xff0c;pipy.org訪問出錯。最后使用anaconda成功啟動…

IDEA 接入 Deepseek

在本篇文章中&#xff0c;我們將詳細介紹如何在 JetBrains IDEA 中使用 Continue 插件接入 DeepSeek&#xff0c;讓你的 AI 編程助手更智能&#xff0c;提高開發效率。 一、前置準備 在開始之前&#xff0c;請確保你已經具備以下條件&#xff1a; 安裝了 JetBrains IDEA&…

前綴和矩陣

前綴和矩陣&#xff08;Prefix Sum Matrix&#xff09;是一種預處理技術&#xff0c;用于快速計算二維矩陣中任意子矩陣的元素和。其核心思想是通過提前計算并存儲每個位置左上角所有元素的和&#xff0c;將子矩陣和的查詢時間從暴力計算的 (O(mn)) 優化到 (O(1))。以下是構建前…

系統架構評估中的重要概念

(1)敏感點(Sensitivity Point) 和權衡點 (Tradeoff Point)。敏感點和權衡點是關鍵的架構 決策。敏感點是一個或多個構件(和/或構件之間的關系)的特性。研究敏感點可使設計人員 或分析員明確在搞清楚如何實現質量目標時應注意什么。權衡點是影響多個質量屬性的特性&#xff0c; …