在 Pandas 中合并索引上的数据帧更有效

Posted

技术标签:

【中文标题】在 Pandas 中合并索引上的数据帧更有效【英文标题】:Merging dataframes on an index is more efficient in 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,它没有明确提到使用索引的任何好处。

【问题讨论】:

相关:What is the performance impact of non-unique indexes in pandas? @jpp 强调独特性是一个问题。使用非唯一索引重新创建您的示例,您将看到性能消失。此外,您忽略了创建索引的时间和精力。在0.23 中的最后一件事,您可以在merge 中引用index 级别的名称,因此df.merge(df2, on='ID')'ID' 是否在索引中时有效。 @piRSquared jpp 链接的问题没有解决使用列合并和使用索引合并之间的时间差。具体来说,为什么两次调用之间存在显着的时间差异? dup 目标解决了使用唯一和/或排序索引进行查找时发生的情况。当您将列放入索引时会发生这种情况。我们可以根据您的具体细节回答您的问题。但是,这是在 dup 目标已经做的事情之上添加任何价值吗?我决定没有。如果你仍然想知道答案是什么,那么也许我错了,它并不像我想象的那么明显。给我一分钟。 好的,重新打开。有人可以将这些元素联系在一起。我仍然认为大部分相关信息都包含在该答案中。 【参考方案1】:

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

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

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

【讨论】:

以上是关于在 Pandas 中合并索引上的数据帧更有效的主要内容,如果未能解决你的问题,请参考以下文章

将具有相同列/索引的两个 pandas DataFrame 合并为一个 DataFrame

数据规整:聚合合并和重塑

python pandas数据框联合合并列表到索引

在 Pandas 中合并数据框(没有列名)

Python pandas - 将具有多个日期索引的csv合并到单个日期索引

Pandas - 合并具有时差的行(当 datetime 为索引时)