【发布时间】:2018-11-30 22:09:49
【问题描述】:
为什么在 Pandas 中在索引上合并数据帧比在列上更有效(更快)?
import pandas as pd
# Dataframes share the ID column
df = pd.DataFrame({'ID': [0, 1, 2, 3, 4],
'Job': ['teacher', 'scientist', 'manager', 'teacher', 'nurse']})
df2 = pd.DataFrame({'ID': [2, 3, 4, 5, 6, 7, 8],
'Level': [12, 15, 14, 20, 21, 11, 15],
'Age': [33, 41, 42, 50, 45, 28, 32]})
df = df.set_index('ID')
df2 = df2.set_index('ID')
这代表了大约 3.5 倍的加速! (使用熊猫 0.23.0)
通读Pandas internals page,它显示一个索引“将标签字典填充到 Cython 中的位置以进行 O(1) 查找。”这是否意味着使用索引进行操作比使用列更有效?始终将索引用于合并等操作是否是最佳实践?
我通读了documentation for joining and merging,它没有明确提到使用索引的任何好处。
【问题讨论】:
-
@jpp 强调独特性是一个问题。使用非唯一索引重新创建您的示例,您将看到性能消失。此外,您忽略了创建索引的时间和精力。在
0.23中的最后一件事,您可以在merge中引用index级别的名称,因此df.merge(df2, on='ID')在'ID'是否在索引中时有效。 -
@piRSquared jpp 链接的问题没有解决使用列合并和使用索引合并之间的时间差。具体来说,为什么两次调用之间存在显着的时间差异?
-
dup 目标解决了使用唯一和/或排序索引进行查找时发生的情况。当您将列放入索引时会发生这种情况。我们可以根据您的具体细节回答您的问题。但是,这是在 dup 目标已经做的事情之上添加任何价值吗?我决定没有。如果你仍然想知道答案是什么,那么也许我错了,它并不像我想象的那么明显。给我一分钟。
-
好的,重新打开。有人可以将这些元素联系在一起。我仍然认为大部分相关信息都包含在该答案中。
标签: python pandas dataframe merge