Случайный пример подмножества кадра данных в Pandas

Скажем, у меня есть блок данных со 100 000 записей и вы хотите разбить его на 100 разделов из 1000 записей.

Как взять случайную выборку размером 50 из только одного из 100 разделов. набор данных уже упорядочен таким образом, что первые 1000 результатов являются первым разделом следующего раздела следующего и так далее.

большое спасибо

Ответ 1

Вы можете использовать метод sample *:

In [11]: df = pd.DataFrame([[1, 2], [3, 4], [5, 6], [7, 8]], columns=["A", "B"])

In [12]: df.sample(2)
Out[12]:
   A  B
0  1  2
2  5  6

In [13]: df.sample(2)
Out[13]:
   A  B
3  7  8
0  1  2

* В одном из разделов DataFrames.

Примечание. Если у вас есть больший размер выборки, размер DataFrame приведет к возникновению ошибки, если вы не попробуете с заменой.

In [14]: df.sample(5)
ValueError: Cannot take a larger sample than population when 'replace=False'

In [15]: df.sample(5, replace=True)
Out[15]:
   A  B
0  1  2
1  3  4
2  5  6
3  7  8
1  3  4

Ответ 2

Одним из решений является использование функции choice из numpy.

Предположим, что вам нужно 50 записей из 100, вы можете использовать:

import numpy as np
chosen_idx = np.random.choice(1000, replace=False, size=50)
df_trimmed = df.iloc[chosen_idx]

Это, конечно, не рассматривает вашу структуру блока. Если вы хотите, чтобы образец 50 элементов из блока i, например, вы можете сделать:

import numpy as np
block_start_idx = 1000 * i
chosen_idx = np.random.choice(1000, replace=False, size=50)
df_trimmed_from_block_i = df.iloc[block_start_idx + chosen_idx]

Ответ 3

Это хорошее место для рекурсии.

def main2():
    rows = 8  # say you have 8 rows, real data will need len(rows) for int
    rands = []
    for i in range(rows):
        gen = fun(rands)
        rands.append(gen)
    print(rands)  # now range through random values


def fun(rands):
    gen = np.random.randint(0, 8)
    if gen in rands:
        a = fun(rands)
        return a
    else: return gen


if __name__ == "__main__":
    main2()

output: [6, 0, 7, 1, 3, 5, 4, 2]