攝影或3C

Python: 如何從Excel檔的欄位字母(column letter)獲取index? from openpyxl.utils import column_index_from_string, get_column_letter ; 從DataFrame的column name獲取index: pandas.DataFrame.columns .get_loc( “column_name” )

加入好友加入好友
加入社群加入社群
Python: 如何從Excel檔的欄位字母(column letter)獲取index? from openpyxl.utils import column_index_from_string, get_column_letter ; 從DataFrame的column name獲取index: pandas.DataFrame.columns .get_loc( "column_name" ) - 儲蓄保險王Python: 如何從Excel檔的欄位字母(column letter)獲取index? from openpyxl.utils import column_index_from_string, get_column_letter ; 從DataFrame的column name獲取index: pandas.DataFrame.columns .get_loc( "column_name" ) - 儲蓄保險王
from openpyxl.utils import column_index_from_string, get_column_letter

# 從欄位名稱轉換為索引數字 (0-based)
def column_name_to_index(column_name):
    return column_index_from_string(column_name) - 1  # 轉換為0-based

# 從索引數字轉換為欄位名稱
def index_to_column_name(index):
    return get_column_letter(index + 1)  # openpyxl 使用1-based

# 示例
print(f"AA 欄位的索引是: {column_name_to_index('AA')}")  # 應該輸出 26
print(f"索引 26 對應的欄位名稱是: {index_to_column_name(26)}")  # 應該輸出 "AA"

輸出結果:

1. openpyxlcolumn_index_from_string

openpyxl.utils.column_index_from_string 是用來
將 Excel 的**欄位名稱(如 A, B, AA)**轉換為整數索引(1-based 索引)。

在程式碼中,為了讓索引變成 0-based 索引(從 0 開始),對返回值減了 1。
範例

功能特點

  • 適用於處理 Excel 的欄位名稱,特別是多字母的欄位名稱(如 AA, ZZ)。
  • 返回的是數字索引,預設是 1-based 索引,你需要手動轉換成 0-based。
  • 適合處理 Excel 格式文件(如 .xlsx)中的欄位操作。

2. Pandas 的 get_loc("欄位名稱")

在 Pandas 的資料框中,get_loc 是用來查找指定欄位名稱的索引位置。這個方法直接返回 0-based 索引,與 openpyxl 的處理方式不同。

範例

import pandas as pd

# 建立 DataFrame
df = pd.DataFrame({
    "A": [1, 2, 3],
    "B": [4, 5, 6],
    "AA": [7, 8, 9]
})

# 使用 get_loc 查找欄位索引
index_A = df.columns.get_loc("A")
index_B = df.columns.get_loc("B")
index_AA = df.columns.get_loc("AA")

print(index_A)   # 輸出: 0
print(index_B)   # 輸出: 1
print(index_AA)  # 輸出: 2

輸出結果:

功能特點

  • get_loc 是 Pandas 的方法,專門用於處理 DataFrame 的欄位名稱
  • 返回的是 0-based 索引,不需要手動轉換。
  • openpyxl 不同,它不處理 Excel 的欄位名稱(如 AAZZ),
    而是直接查找 DataFrame 的欄位名稱。

差異比較與應用場景

實際應用:
Excel檔有多欄特徵值 + 1欄響應值response,
讀取進來成為DataFrame後
依據最後一欄的特徵值(column name)
.get_loc() 獲取index (0-base) +1
(可以用來切割特徵值/響應值)
這個index (0-base) +1 再丟進去
get_column_letter() 獲取Excel檔的 欄位字母
可以確定沒有做錯
響應值如法炮製

推薦hahow線上學習python: https://igrape.net/30afN

如果不使用openpyxl

def column_name_to_index(column_name):
    """
    將 Excel 欄位名稱轉換為對應的索引數字 (0-based)
    例如A -> 0, Z -> 25, AA -> 26, BA -> 53
    """
    result = 0
    for char in column_name:
        result = result * 26 + (ord(char) - ord('A') + 1)
    return result - 1

def index_to_column_name(index):
    """
    將索引數字轉換為 Excel 欄位名
    例如0 -> A, 25 -> Z, 26 -> AA, 53 -> BA
    """
    # 轉換為 1-based
    index = index + 1
    
    result = ""
    while index > 0:
        index, remainder = divmod(index - 1, 26)
        result = chr(ord('A') + remainder) + result
    return result

# 測試
print(f"AA 欄位的索引是: {column_name_to_index('AA')}")  # 輸出 26
print(f"索引 26 對應的欄位名稱是: {index_to_column_name(26)}")  # 輸出 "AA"

輸出結果:

推薦hahow線上學習python: https://igrape.net/30afN

divmod() 是 Python 的一個內建函數,它同時執行除法和取餘數操作,並以元組形式返回結果。讓我詳細解釋這個函數以及模運算的概念:

divmod() 函數

基本語法

divmod(a, b)

返回值

返回一個包含兩個值的元組 (quotient, remainder),相當於 (a // b, a % b),分別是:

  • 商(整除的結果)
  • 餘數

例子

result = divmod(13, 5)
print(result)  # 輸出: (2, 3)
# 因為 13 除以 5 得商 2  3

# 等同於:
quotient = 13 // 5  # 整數除法
remainder = 13 % 5  # 取餘數
print((quotient, remainder))  # 輸出: (2, 3)

輸出結果:

模運算 (Modulo Operation)

模運算是一種數學運算,用 % 符號表示,用於計算除法後的餘數。

基本語法

a % b

例子

print(7 % 3)  # 輸出: 1 (7 除以 3 的餘數是 1)
print(15 % 4)  # 輸出: 3 (15 除以 4 的餘數是 3)
print(10 % 5)  # 輸出: 0 (10 除以 5 的餘數是 0表示能整除)

輸出結果:

在 Excel 欄位轉換中的應用

在之前的 index_to_column_name 函數中,我們使用 divmod() 來將數字轉換為 26 進制(A-Z)的表示:

def index_to_column_name(index):
    # 轉換為 1-based
    index = index + 1
    
    result = ""
    while index > 0:
        index, remainder = divmod(index - 1, 26)
        result = chr(ord('A') + remainder) + result
    return result

這裡的工作原理是:

  1. 我們將索引加 1(因為 Excel 是 1-based)
  2. 執行 divmod(index - 1, 26)
    • 獲取商(下一次迴圈的 index)
    • 獲取餘數(轉換為對應的字母)
  3. 重複這個過程直到 index 變為 0

例子:將索引 26 轉換為 “AA”

初始: index = 26 + 1 = 27
第一步: divmod(27-1, 26) = (1, 0) → A 
(因為 ord('A') + 0 用chr()轉為字母= 'A')
第二步: divmod(1-1, 26) = (0, 0) → A
最終結果: "AA"

例子:將索引 51 轉換為 “AZ”

初始: index = 51 + 1 = 52
第一步: divmod(52-1, 26) = (1, 25) → Z 
(因為 ord('A') + 25 用chr()轉為字母= 'Z')
第二步: divmod(1-1, 26) = (0, 0) → A
最終結果: "AZ"

這種方式非常類似於
將十進制數轉換為其他進制的方法,
只是這裡使用的是 26 進制的表示法,
其中每個位置使用 A-Z 表示 0-25。

推薦hahow線上學習python: https://igrape.net/30afN

儲蓄保險王

儲蓄險是板主最喜愛的儲蓄工具,最喜愛的投資理財工具則是ETF,最喜愛的省錢工具則是信用卡

Share
Published by
儲蓄保險王