我想将pandas DataFrame分成十个不相交,大小相等,随机组合的子集。
我知道我可以使用以下方法随机抽取十分之一的原始pandas DataFrame:
partition_1 = pandas.DataFrame.sample(frac=(1/10))
但是,我如何获得其他九个分区?如果我再次pandas.DataFrame.sample(frac=(1/10))
,我的子集可能不会脱节。
感谢您的帮助!
答案 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