首页 > 解决方案 > 运行时为 MultiIndex DataFrame 设置值变慢

问题描述

我有一个11729 rows × 8 columnsDataFrame,我想11729 × 30 × 8用MultiIndex将它转换成一个矩阵,30表示每30行11729行,从0到11728 - 30

一个更简短的例子:

原始 2d DataFrame 如下所示:

      col0   col1
0        1      2
1        3      4
2        5      6
3        7      8
4        9     10

我想要得到的 3d MultiIndex DataFrame 看起来像:

           col0    col1
0    c0       1       2
     c1       3       4
     c2       5       6
1    c0       3       4
     c1       5       6
     c2       7       8
2    c0       5       6
     c1       7       8
     c2       9      10

这意味着(0,c0)~(0,c2)来自原始DataFrame中的0~2行,(1,c0)~(1,c2)来自原始DataFrame中的1~3行,(2,c0)~(2 ,c2) 来自原始 DataFrame 中的 2~4 行。

我正在使用以下代码将原始 2d DataFrame 转换为 MultiIndex 3d DataFrame:

multi_index = pd.MultiIndex(levels=[[],[]],
                             labels=[[],[]],
                             names=['', ''])
df = pd.DataFrame(index=multi_index, columns=origin_df.columns)
for i in range(n):
    for j in range(i, len(origin_df) - (n - i)):
        print("i{}/n{},j{}".format(i, n, j))  # print progress
        df.loc[(j, 'c%d' % i), :] = origin_df.loc[origin_df.index[j]].tolist()
for i in range(n, len(origin_df)):
    df.loc[(i, 'y'), :] = origin_df.loc[origin_df.index[i]].tolist()
return df

我的问题是运行时插入速度变慢。起初进度输出很快,但越来越慢。我该如何优化此操作?

标签: pandasdataframe

解决方案


您不应该一一添加。这是我要做的:

# toy data:
df = pd.DataFrame(np.arange(11792*8).reshape(-1,8));
window = 30
new_len = len(df) - window + 1

# create new dataframe, ignoring the index
new_df = pd.concat(df.iloc[i:i+window] for i in range(new_len))

# modify the index
new_df.index = pd.MultiIndex.from_product([np.arange(new_len), [f'c{i}' for i in range(window)]])

在 6600k 上大约需要 1 秒。使用您的样本数据,输出为:

      col0  col1
0 c0     1     2
  c1     3     4
  c2     5     6
1 c0     3     4
  c1     5     6
  c2     7     8
2 c0     5     6
  c1     7     8
  c2     9    10

推荐阅读