从单个数据帧创建多个子集,无需替换
Posted
技术标签:
【中文标题】从单个数据帧创建多个子集,无需替换【英文标题】:Creating multiple subsets from single data frame, without replacement 【发布时间】:2019-09-11 17:03:12 【问题描述】:我正在尝试创建 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() 变体。 没有任何工作。到目前为止,堆栈溢出似乎没有给我我需要的结果。
【问题讨论】:
嗨! Exaclty,您需要什么结果?请你澄清一下好吗? 嗨,这个主数据框中有 50 个成员,我正在尝试使用这些假成员来滚动 10 个月归因于一个程序。我需要每月使用 5 个唯一成员。因此,第一个子集中有 5 个唯一 ID,然后在下一个子集中有 5 个唯一 ID……等等,来自这个主数据帧。 ID 应该只在各自的子集中是唯一的吗?也就是说,同一个ID可以在不同月份出现在两个不同的子集中? 每个ID只能出现在一个子集中,不再重复。 【参考方案1】:这里是使用pandas
的解决方案。
假设master
是您使用pandas
创建的主数据框,您可以这样做:
shuffled = master.sample(frac=1)
这会创建一个主数据框的副本,其中的行随机重新排序。请参阅 *** 上的 this answer 或 the docs 了解 sample
方法。
然后,您可以简单地按顺序构建 10 个较小的 5 行数据框。
subsets = []
for i in range(10):
subdf = shuffled.iloc[(i*5):(i+1)*5]
subsets.append(subdf)
subsets
是包含您的小数据框的列表。做:
for sub in subsets:
print(sub)
将它们全部打印出来并用肉眼确认没有重复。
【讨论】:
【参考方案2】:这似乎是一个组合问题。这是一个解决方案: 你应该创建你的列表,比如 L。然后你决定子集的大小,比如 r。之后是代码:
from itertools import combinations
combinations(L,r)
但是,如果您不想决定要创建的集合的大小,则可以使用 random 模块,如下所示:
import random
from itertools import combinations
combinations(L,r = random(a,b))
在这种情况下,这将从列表 L 中创建一组随机的 r(a 和 b 之间的随机整数)元素。如果你想这样做 10 次,你可以创建一个 for
循环。
我希望这对你有用。
【讨论】:
【参考方案3】:假设我们有 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']]
【讨论】:
以上是关于从单个数据帧创建多个子集,无需替换的主要内容,如果未能解决你的问题,请参考以下文章