合并 pandas MultiIndex 很慢

Posted

技术标签:

【中文标题】合并 pandas MultiIndex 很慢【英文标题】:merge pandas MultiIndex is very slow 【发布时间】:2018-06-30 11:50:10 【问题描述】:

我注意到 pandas 在基于 MultiIndex 的合并 DataFrame 上非常慢。赋值有时也很慢

import pandas as pd
import numpy as np
from pandas_datareader import data
import datetime
import string
import random

start = datetime.datetime(2002, 1, 1)
end = datetime.datetime(2018, 1, 1)


def id_generator(size=6, chars=string.ascii_uppercase + string.digits):
    return ''.join(random.choice(chars) for _ in range(size))

columns = [id_generator() for i in range(1000)]
dateindex = pd.date_range(start, end)
df = pd.DataFrame(np.random.randint(1, 100, (len(dateindex), len(columns))), columns=columns, index=dateindex)
df.columns = df.columns.rename('Name')
df.index = df.index.rename('Date')

df1 = df.pct_change(1).stack().rename('change1').to_frame()
df2 = df.pct_change(2).stack().rename('change2').to_frame()

df3 = df1.reset_index()
df4 = df2.reset_index()



%timeit pd.merge(df1, df2, left_index=True, right_index=True)
In [11]: 46.7 s ± 656 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit pd.merge(df3, df4, on=['Date', 'Name'])
In [12]: 3.17 s ± 168 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

速度慢了 10 倍以上。有谁知道发生了什么?休息索引并加入列而不是 MultiIndex 总是更好吗?

【问题讨论】:

【参考方案1】:

让我们使用join:

%timeit df1.join(df2)

1 loop, best of 3: 647 ms per loop

【讨论】:

我正在阅读一些文档:pd.join 实际上是在使用 pd.merge。为什么会导致性能差异?

以上是关于合并 pandas MultiIndex 很慢的主要内容,如果未能解决你的问题,请参考以下文章

在 Pandas 中将两个 MultiIndex 级别合并为一个

pandas 与 MultiIndex 合并,当只有一级索引用作键时

合并pandas DataFrames时如何保留列MultiIndex值

Pandas 将 CSV 中的 SingleIndex 合并到 MultiIndex

如何在Python Pandas中将MultiIndex Dataframes与权重合并?

在 pandas MultiIndex DataFrame 中按级别求和列