将数据框拆分为块并将其添加到多索引中

时间:2015-07-31 14:48:06

标签: python pandas

我有一个索引数据框,有77000行。

我想将每7000行分组为更高维度的多索引,从而制作11组更高维度的索引。

我知道我可以在所有索引中编写一个循环并创建一个元组并通过dataframe.MultiIndex.from_tuples方法分配它。

有一种优雅的方式来做这件简单的事吗?

3 个答案:

答案 0 :(得分:1)

您可以使用the pd.qcut function创建可添加到索引的新列。

以下是创建五个组/块的示例:

df = pd.DataFrame({'data':range(1,10)})
df['chunk'] = pd.qcut(df.data, 5, labels=range(1,6))
df.set_index('chunk', append=True, inplace=True)
df
             data
index chunk      
0     1         1
1     1         2
2     2         3
3     2         4
4     3         5
5     4         6
6     4         7
7     5         8
8     5         9

您可以df['chunk'] = pd.qcut(df.index, 11)将您的数据块分配给您的数据框。

答案 1 :(得分:0)

下面的代码会创建一个0-10范围内的有序列,该列会平铺到DataFrame的长度。由于您希望根据旧索引加上新折叠进行分组,因此首先需要在执行groupby之前重置索引。

groups = 11
folds = range(groups) * (len(df) // groups + 1)
df['folds'] = folds[:len(df)]
gb = df.reset_index().groupby(['old_index', 'folds'])

old_index显然是索引的名称。

如果您希望拥有连续组(例如前7k行,接下来的7k行等),那么您可以执行以下操作:

df['fold'] = [i // (len(df) // groups) for i in range(len(df))]

注意://运算符用于分隔任何余数。

答案 2 :(得分:0)

另一种方法是使用整数除法//,假设您的数据帧具有默认的整数索引:

import pandas as pd
import numpy as np

# data
# ===============================================
df = pd.DataFrame(np.random.randn(10), columns=['col'])
df

# processing
# ===============================================
df['chunk'] = df.index // 5
df.set_index('chunk', append=True)

            col
  chunk        
0 0      2.0955
1 0     -1.2891
2 0     -0.3313
3 0      0.1508
4 0     -1.0215
5 1      0.6051
6 1     -0.3227
7 1     -0.6394
8 1     -0.7355
9 1      0.5949