Python / Pandas - 在10个不相交的,大小相等的子集中对pandas DataFrame进行分区

时间:2016-07-25 14:19:26

标签: python python-2.7 pandas dataframe partitioning

我想将pandas DataFrame分成十个不相交,大小相等,随机组合的子集。

我知道我可以使用以下方法随机抽取十分之一的原始pandas DataFrame:

partition_1 = pandas.DataFrame.sample(frac=(1/10))

但是,我如何获得其他九个分区?如果我再次pandas.DataFrame.sample(frac=(1/10)),我的子集可能不会脱节。

感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

使用np.random.permutations

df.loc[np.random.permutation(df.index)]

在将数据帧拆分为10之后,它将对数据帧进行洗牌并保留列名。

答案 1 :(得分:2)

假设df是您的数据框,并且您希望N_PARTITIONS分区的大小大致相同(如果len(df)可被N_PARTITIONS整除,则它们的完全大小相同np.random.permutation)。

使用np.arange(len(df))置换数组N_PARTITIONS。然后使用步骤.iloc[]获取该数组的切片,并使用import numpy as np permuted_indices = np.random.permutation(len(df)) dfs = [] for i in range(N_PARTITIONS): dfs.append(df.iloc[permuted_indices[i::N_PARTITIONS]]) 提取数据框的相应行。

range(N_PARTITIONS)

由于您使用的是Python 2.7,最好将xrange(N_PARTITIONS)切换为frmParent以获取迭代器而不是列表。

答案 2 :(得分:1)

从此开始。

 dfm = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',  'foo', 'bar', 'foo', 'foo']*2,
                      'B' : ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three']*2}) 

     A      B
0   foo    one
1   bar    one
2   foo    two
3   bar  three
4   foo    two
5   bar    two
6   foo    one
7   foo  three
8   foo    one
9   bar    one
10  foo    two
11  bar  three
12  foo    two
13  bar    two
14  foo    one
15  foo  three

Usage: 
Change "4" to "10", use [i] to get the slices.  

np.random.seed(32) # for reproducible results.
np.array_split(dfm.reindex(np.random.permutation(dfm.index)),4)[1]
      A    B
2   foo  two
5   bar  two
10  foo  two
12  foo  two

np.array_split(dfm.reindex(np.random.permutation(dfm.index)),4)[3]

     A      B
13  foo    two
11  bar  three
0   foo    one
7   foo  three