操纵多索引数据框的最快方法是什么?

时间:2020-10-12 15:11:59

标签: python pandas numpy dataframe multi-index

我想操纵一个多索引数据帧,但是我发现它比单索引数据帧(功能基本相同)低得多。

例如,我们创建形状为30 * 30的数据框。并将其堆叠以获得多索引数据框。

import pandas as pd
import numpy as np

n = 30
groupA = [f'A{_}' for _ in range(n)]
groupB = [f'B{_}' for _ in range(n)]
single = pd.DataFrame(np.array([_ for _ in range(n*n)]).reshape((n, n)), columns=groupB, index=groupA)
multi = single.stack().to_frame()
multi.columns = ['item']

为了说明我的观点,让我们将单索引数据框向右移动一步,然后添加Nan以填补空白。

def func(row):
    row = np.concatenate(([np.nan], row.values[:-1]))
    return row
    
%timeit -n 100 single_shift = single.apply(func, axis=1, result_type='expand')

Timeit结果是:

每个循环2.52 ms±228 µs(平均±标准偏差,共运行7次,每个循环100个循环)

已移动的数据框: Shifted single index dataframe

但是,如果我们对多索引数据帧执行相同的操作,则速度要慢20倍。 像这样:

def shift(multi):
    for ai in multi.index.levels[0]:
        multi.loc[(ai, slice(None)), 'item'] = np.concatenate(([np.nan], multi.loc[(ai, slice(None)), 'item'].values[:-1]))
    return multi

%timeit -n 100 shift_multi = shift(multi)

Timeit结果是:

每个循环46.2 ms±6.1 ms(平均±标准偏差,共运行7次,每个循环100个循环)

已移动的多索引数据框:

Shifted multi-index dataframe Shifted multi-index dataframe2

正如我们所看到的,通过相同的动作获得相同的结果。但是使用multiindex进行相同的操作需要20倍的时间。有没有更快的方法来操纵多索引数据框? 预先感谢。

0 个答案:

没有答案