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

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']]

【讨论】:

以上是关于从单个数据帧创建多个子集,无需替换的主要内容,如果未能解决你的问题,请参考以下文章

从多个 OHLCV 数据帧创建单个 pandas 数据帧

如何用从一个数据帧到另一个数据帧的值替换字符串

有没有办法循环多个数据帧以删除相同的列?

r 从数据帧中删除NA并替换为0

用 JavaScript 字符串中的单个空格替换多个空格

如何使用excel vba从行创建多个word文档?