【问题标题】:Merging dataframes on an index is more efficient in Pandas在 Pandas 中合并索引上的数据帧更有效
【发布时间】: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


【解决方案1】:

原因是DataFrame的索引is backed by a hash table

要合并两个集合,我们需要为第一个中的每个元素找到第二个中的对应元素(如果存在)如果哈希表支持,搜索会明显更快,因为在未排序列表中搜索是 O(N),而在哈希函数〜O(1)支持的列表中。

一种可以更快合并列的策略是首先为两者中的最小者创建一个哈希表。但这仍然意味着在创建此字典所需的时间之前,合并会变慢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-30
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多