我想操纵一个多索引数据帧,但是我发现它比单索引数据帧(功能基本相同)低得多。
例如,我们创建形状为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个循环)
但是,如果我们对多索引数据帧执行相同的操作,则速度要慢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个循环)
已移动的多索引数据框:
正如我们所看到的,通过相同的动作获得相同的结果。但是使用multiindex进行相同的操作需要20倍的时间。有没有更快的方法来操纵多索引数据框? 预先感谢。