Случайный пример подмножества кадра данных в 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]