矢量化操作是 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()
,这会让代码不仅更简洁,而且性能也会显著提升。在处理大型数据集时,这种性能差异尤为明显。