首页 > 解决方案 > 如何使用 N 行批次将数据分成两组?

问题描述

我需要df使用 2 个批次将我的数据集随机分成两组(比例 70:30)。“批次”是指 2 个(批量大小)连续行应始终属于同一组。

  col1    col2    col3
  1       0.5     10
  1       0.3     11
  5       1.4     1
  3       1.5     2
  1       0.9     10
  3       0.4     7
  1       1.2     9
  3       0.1     11

样本结果(由于随机性,输出可能会有所不同,但这只是一个示例):

set1
      col1    col2    col3
      1       0.5     10
      1       0.3     11
      1       0.9     10
      3       0.4     7
      1       1.2     9
      3       0.1     11

set2
      5       1.4     1
      3       1.5     2

我知道如何使用 1 的批次随机拆分数据:

import numpy as np

msk = np.random.rand(len(df)) < 0.7
set1 = df[msk]
set2 = df[~msk] 

但是,不确定如何引入灵活的批处理。

谢谢。

更新:

这是我目前拥有的,但最后一行代码失败。set1并且set2应该是熊猫数据框。

n = 3
df_batches = [df[i:i+n] for i in range(0, df.shape[0],n)]

set1_idx = np.random.randint(len(df_batches), size=int(0.7*len(df_batches)))
set2_idx = np.random.randint(len(df_batches), size=int(0.3*len(df_batches)))
set1, set2 = df_batches[set1_idx,:], df_batches[set2_idx,:]

标签: pythonpython-3.xpandas

解决方案


这是一个基于随机整数做你想做的事情然后取 30% 的函数:

def split_data(df, batchsize):
    x = np.random.randint(0, len(df))
    idx = round(len(df) * batchsize)

    # so we don't get out of the bounds of our index
    if x + idx > len(df):
        x = x - idx

    batch1 = df.loc[np.arange(x, x+idx)]
    batch2 = df.loc[~df.index.isin(batch1.index)]

    return batch1, batch2

df1, df2 = split_data(df, 0.3)
print(df1, '\n')
print(df2)

   col1  col2  col3
4     1   0.9    10
5     3   0.4     7 

   col1  col2  col3
0     1   0.5    10
1     1   0.3    11
2     5   1.4     1
3     3   1.5     2
6     1   1.2     9
7     3   0.1    11

推荐阅读