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. openpyxl
的 column_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 的欄位名稱(如AA
或ZZ
),
而是直接查找 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(因為 Excel 是 1-based)
- 執行
divmod(index - 1, 26)
:- 獲取商(下一次迴圈的 index)
- 獲取餘數(轉換為對應的字母)
- 重複這個過程直到 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