【发布时间】:2017-07-19 16:28:48
【问题描述】:
我有一个大约 100 行的 pandas DataFrame,我需要从其中以有效的方式从给定索引的列中选择值。目前我正在为此使用df.loc[index, 'col'],但这似乎相对较慢:
df = pd.DataFrame({'col': range(100)}, index=range(100))
%timeit df.loc[random.randint(0, 99), 'col']
#100000 loops, best of 3: 19.3 µs per loop
似乎更快(大约 10 倍)的方法是将数据框转换为字典,然后查询:
d = df.to_dict()
%timeit d['col'][random.randint(0, 99)]
#100000 loops, best of 3: 2.5 µs per loop
有没有办法使用普通数据框方法获得类似的性能,而无需显式创建字典?我应该使用.loc以外的东西吗?
或者这只是我最好使用此解决方法的情况?
【问题讨论】:
-
这里有几个选择:
df.get_value(random.randint(0, 99), 'col')(最快)、df['col'].values[random.randint(0, 99)](假设位置和标签相同)和df.at[random.randint(0, 99), 'col'],但这部分通常不是你应该关注的部分在进行代码优化时。可能您在循环中执行此操作,对吗? -
同意@ayhan,纯粹的 Python 字典几乎肯定会比 Pandas 方法更快地按索引读取标量值,因为 Pandas 方法严重过载,并且每个方法都包含多个字典访问。性能提升的最大潜力在于使用矢量化函数而不是 Python 循环。
-
不幸的是,矢量化在这里并不是一个真正的选择,因为我需要逐行处理文件并且无法将所有数据保存在内存中。在我的情况下,从
.loc切换到dict似乎确实会导致整个循环的速度提高大约 5-10 倍。