Python 将数据帧拆分为块,并将它们添加到多索引中

Python 将数据帧拆分为块,并将它们添加到多索引中,python,pandas,Python,Pandas,我有一个索引数据帧,它有77000行 我想将每7000行分组到一个高维多索引中,生成11组高维索引 我知道我可以编写一个遍历所有索引的循环,生成一个元组,并通过dataframe.MultiIndex.from\u tuples方法分配它 有没有一种优雅的方法来完成这个简单的任务?您可以使用它来创建一个新列,并将其添加到索引中 下面是一个创建五个组/块的示例: df = pd.DataFrame({'data':range(1,10)}) df['chunk'] = pd.qcut(df.dat

我有一个索引数据帧,它有77000行

我想将每7000行分组到一个高维多索引中,生成11组高维索引

我知道我可以编写一个遍历所有索引的循环,生成一个元组,并通过
dataframe.MultiIndex.from\u tuples
方法分配它

有没有一种优雅的方法来完成这个简单的任务?您可以使用它来创建一个新列,并将其添加到索引中

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

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)
将区块分配给数据帧。

下面的代码创建一个0-10范围内的有序列,该列平铺到数据帧的长度。由于要根据旧索引和新折叠进行分组,因此在执行
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))]

注意:
/
运算符用于楼层分割以截断任何余数。

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

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    

你能不能只做
pd.MultiIndex.from_product([df.index.tolist(),np.arange(11)],name=['first','second'])
来设置索引?如果我这样做,我将从
df.index.tolist()
得到77000的总数,然后乘以
np.arange(11)
,这将产生77000*11个索引。这不是分割它,而是相反的操作。也许您想使用将df分割为桶