向量化操作是 Pandas 的一個強大特性,它允許你對整個 DataFrame
或 Series
進行操作,而不需要顯式地寫出迴圈。向量化操作利用底層的 C 語言實現和最佳化,使得它在處理大資料集時比迴圈效率更高。
使用向量化操作替代 iterrows()
的示例
假設你有以下 DataFrame df
,並且你想要在每一行上執行某些操作:
import pandas as pd data = {'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]} df = pd.DataFrame(data)
示例 1: 對某一列的資料進行轉換
假設你想對 A
列中的每個值加 10,使用 iterrows()
你可能會這樣做:
import pandas as pd data = {'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]} df = pd.DataFrame(data)
使用向量化操作,只需一行程式碼:
df['A'] = df['A'] + 10
示例 2: 根據多列的條件來生成新列
假設你想根據 A
和 B
兩列的值生成新的一列 D
,內容是 A
和 B
的和,使用 iterrows()
你可能會這樣做:
for index, row in df.iterrows(): df.at[index, 'D'] = row['A'] + row['B']
使用向量化操作:
df['D'] = df['A'] + df['B']
示例 3: 條件篩選並修改
假設你想在 C
列大於 7 時,將 A
列的值改為 0,使用 iterrows()
你可能會這樣做:
for index, row in df.iterrows(): if row['C'] > 7: df.at[index, 'A'] = 0
使用向量化操作:
df.loc[df['C'] > 7, 'A'] = 0
示例 4: 使用 apply
函式進行更復雜的操作
如果你需要對一列的值進行復雜的變換,使用 apply
是向量化操作的一個變體,效能仍然優於 iterrows()
。例如:
df['A'] = df['A'].apply(lambda x: x ** 2 + 2 * x + 1)
為什麼向量化操作更快?
- 底層實現:向量化操作是在底層 C 或 Cython 程式碼中直接執行的,這比逐行操作的 Python 迴圈快得多。
- 減少 Python 迴圈:
iterrows()
逐行操作,每一行的資料處理都會引起 Python 直譯器的呼叫,而向量化操作通常是在更接近硬體的層次上執行的。 - 平行計算:在某些情況下,向量化操作可以自動並行化,從而進一步提升效能。
總結
儘可能使用向量化操作來代替迴圈和 iterrows()
,這會讓程式碼不僅更簡潔,而且效能也會顯著提升。在處理大型資料集時,這種效能差異尤為明顯。