从单个数据帧创建多个子集,无需替换

时间:2019-04-22 13:52:03

标签: python

我正在尝试创建5个成员的10个不同子集,而不用此数据进行替换(在Python中):

      Member CIN Needs Assessment Network Enrolled
117   CS38976K                1                1
118   GN31829N                1                1
119   GD98216H                1                1
120   VJ71307A                1                1
121   OX22563R                1                1
122   YW35494W                1                1
123   QX20765B                1                1
124   NO50548K                1                1
125   VX90647K                1                1
126   RG21661H                1                1
127   IT17216C                1                1
128   LD81088I                1                1
129   UZ49716O                1                1
130   UA16736M                1                1
131   GN07797S                1                1
132   TN64827F                1                1
133   MZ23779M                1                1
134   UG76487P                1                1
135   CY90885V                1                1
136   NZ74233H                1                1
137   CB59280X                1                1
138   LI89002Q                1                1
139   LO64230I                1                1
140   NY27508Q                1                1
141   GU30027P                1                1
142   XJ75065T                1                1
143   OW40240P                1                1
144   JQ23187C                1                1
145   PQ45586F                1                1
146   IM59460P                1                1
147   OU17576V                1                1
148   KL75129O                1                1
149   XI38543M                1                1
150   PO09602E                1                1
151   PS27561N                1                1
152   PC63391R                1                1
153   WR70847S                1                1
154   XL19132L                1                1
155   ZX27683R                1                1
156   MZ63663M                1                1
157   FT35723P                1                1
158   NX90823W                1                1
159   SC16809F                1                1
160   TX83955R                1                1
161   JA79273O                1                1
162   SK66781D                1                1
163   UK69813N                1                1
164   CX01143B                1                1
165   MT45485A                1                1
166   LJ25921O                1                1

我尝试对range()中的_使用很多random.sample()变体。 什么都没用。到目前为止,堆栈溢出似乎都没有给我所需的结果。

3 个答案:

答案 0 :(得分:1)

这似乎是一个组合问题。这是一个解决方案: 您应该创建列表,说L。然后确定子集的大小,说r。之后是代码:

from itertools import combinations combinations(L,r)

但是,如果您不想确定要创建的集合的大小,则可以按以下方式使用随机模块:

import random from itertools import combinations combinations(L,r = random(a,b))

在这种情况下,这将从列表L中创建一个随机的r组(在a和b之间的随机整数)元素。如果要执行10次,可以创建一个for循环。

我希望对您有用。

答案 1 :(得分:1)

让我们假设我们有lines变量和您的数据集的迭代器。然后:

from random import sample

# Chunk length
chunk_len = 2

# Number of chunks
num_of_chunks = 5

# Get the sample with data for all chunks. It guarantees us that there will
# be no repetitions
random_sample = sample(lines, num_of_chunks*chunk_len)

# Construct the list with chunks
result = [random_sample[i::num_of_chunks] for i in range(num_of_chunks)]
result

会返回:

[['123   QX20765B                1                1',
  '118   GN31829N                1                1'],
 ['127   IT17216C                1                1',
  '122   YW35494W                1                1'],
 ['138   LI89002Q                1                1',
  '126   RG21661H                1                1'],
 ['120   VJ71307A                1                1',
  '121   OX22563R                1                1'],
 ['143   OW40240P                1                1',
  '142   XJ75065T                1                1']]

答案 2 :(得分:1)

这是使用pandas的解决方案。

假设master是使用pandas创建的主数据框,则可以执行以下操作:

shuffled = master.sample(frac=1)

这将创建主数据帧的副本,其中行随机重新排序。有关堆栈sample的信息,请参见this answer,有关堆栈溢出的信息,请参见the docs
然后,您可以按顺序依次构建10个较小的,每行五行的较小数据框。

subsets = []
for i in range(10):
    subdf = shuffled.iloc[(i*5):(i+1)*5]
    subsets.append(subdf)

subsets是包含您的小型数据框的列表。做:

for sub in subsets:
    print(sub)

将它们全部打印出来,并通过肉眼确认没有重复。

相关问题