python - Pandas 替换/字典缓慢

标签 python performance pandas dictionary

请帮助我理解为什么这个“从字典替换”操作在 Python/Pandas 中很慢:

# Series has 200 rows and 1 column
# Dictionary has 11269 key-value pairs
series.replace(dictionary, inplace=True)

字典查找应该是 O(1)。替换列中的值应该是 O(1)。这不是向量化操作吗?就算不向量化,迭代200行也不过200次迭代,怎么会慢呢?

这是一个演示该问题的 SSCCE:

import pandas as pd
import random

# Initialize dummy data
dictionary = {}
orig = []
for x in range(11270):
    dictionary[x] = 'Some string ' + str(x)
for x in range(200):
    orig.append(random.randint(1, 11269))
series = pd.Series(orig)

# The actual operation we care about
print('Starting...')
series.replace(dictionary, inplace=True)
print('Done.')

在我的机器上运行该命令需要超过 1 秒,这比执行 <1000 次操作的预期时间长 1000 倍。

最佳答案

看起来像replace有一点开销,并通过 map 明确告诉系列要做什么产生最佳性能:

series = series.map(lambda x: dictionary.get(x,x))

如果您确定所有键都在您的字典中,您可以通过不创建 lambda 并直接提供 dictionary.get 函数来获得非常轻微的性能提升。任何不存在的键都将通过此方法返回 NaN,因此请注意:

series = series.map(dictionary.get)

您也可以只提供字典本身,但这似乎会引入一些开销:

series = series.map(dictionary)

时间

使用您的示例数据进行的一些时间比较:

%timeit series.map(dictionary.get)
10000 loops, best of 3: 124 µs per loop

%timeit series.map(lambda x: dictionary.get(x,x))
10000 loops, best of 3: 150 µs per loop

%timeit series.map(dictionary)
100 loops, best of 3: 5.45 ms per loop

%timeit series.replace(dictionary)
1 loop, best of 3: 1.23 s per loop

关于python - Pandas 替换/字典缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41985566/

相关文章:

python - 创建一个可变长度的颜色查找表

python - 如何在 Django View 中运行命令行 python 脚本?

python - 使用两个不同的函数后,全局变量不会保持其状态

mysql - 在 mysql 中应用多个联接时提高性能

javascript - 如果我们正在循环访问当前项目,哪个 for/forEach 的性能更高?

java - 如何测量java方法的内存使用情况

python - 从系列中选择一项并保留索引

python - 如何在 python 中创建一个以随机字母作为键且没有重复项的字典?

python - 如何将 Pandas 数据框行快速转换为有序字典

python - 将函数应用于 pandas groupby 数据框中的所有列