Взять случайные группы столбцов из датафрейма
У меня есть небольшой датайфрем в котором каждые 4 стобца сгруппированы между собой и относятся к одной сущности (это обозначается первой цифрой в названии столбцов). Всего 60столбоц и 15 общностей: данные.
Мне необходимо случайным образом взять 5 таких общностей и составить из них датафрейм для дальнейшей работы. Эту процедуру я буду выполнять много раз, делать много всевозможных комбинаций.
Пока удалось придумать, как это сделать, только путем случайного вытаскивния строчек: для этого я транспонирую данные, выбираю случайным образом строки и транспонирую обратно:
df.T
df.sample(n=5)
df.T
Но придумать, как вытаскивать не 5 рандомных строк, а именно 5 общностей (5 групп по 4 строки, каждая из которых с одинаковым номером в первой цифре), пока не могу. Можете посоветовать что-нибудь, пожалуйста?
Надеюсь, суть вопроса нормально описана..
Ответы (1 шт):
Я бы предложил создать мультиндекс сначала, чтобы удобнее было работать с группами колонок, а затем выбирать из групп случайные самплы:
import pandas as pd
import random
ваш df:
1.1 1.6 1.8 1.10 2.7 2.4 2.11 2.1 3.6 3.3 ... 13.2 13.6 14.4 14.7 14.5 14.1 15.3 15.6 15.1 15.5
0 2 3 4 2 2 3 3 4 2 3 ... 3 3 2 3 4 2 2 3 3 3
1 4 3 3 0 4 2 3 4 4 4 ... 3 3 2 3 3 4 2 3 3 3
2 4 3 3 2 4 4 3 4 3 3 ... 3 4 2 3 3 4 4 3 3 4
3 3 2 4 3 1 4 3 4 4 3 ... 3 4 3 4 4 3 1 3 3 4
4 4 3 4 3 2 3 3 3 2 3 ... 4 3 2 3 3 4 2 1 4 3
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
278 4 3 2 3 4 2 3 4 4 1 ... 2 4 4 3 3 4 4 3 3 4
279 4 4 3 3 4 3 4 3 2 3 ... 3 4 4 3 3 2 4 3 3 4
280 4 3 3 4 2 3 3 4 2 3 ... 3 4 4 3 3 3 2 3 3 2
281 3 4 4 3 4 3 3 3 4 4 ... 3 3 4 3 4 3 4 3 4 3
282 3 3 4 3 4 2 4 3 3 3 ... 2 4 4 4 4 4 2 4 4 3
далее:
df.columns = pd.MultiIndex.from_arrays([[i.split(".")[0] for i in df.columns], [i.split(".")[1] for i in df.columns]])
df[random.sample(df.columns.levels[1].tolist(), 5)]
получаем что-то типа такого:
8 10 7 3 6
6 5 4 8 7 5 3 6 6 5 4 2 6 3 5 4 4 2 3 6
0 2 3 3 2 2 3 3 4 2 3 3 2 2 3 4 3 2 3 4 4
1 2 3 3 4 2 3 3 4 2 3 3 3 4 4 3 4 0 3 1 4
2 4 3 3 4 4 1 1 4 4 3 3 0 3 3 3 4 2 3 4 4
3 4 4 3 3 4 3 4 4 1 3 3 3 4 3 4 4 3 3 1 2
4 2 1 3 4 3 2 3 4 2 3 3 2 2 3 3 4 2 3 3 4
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
278 4 3 4 4 4 3 3 4 4 4 4 3 4 1 4 4 3 3 3 4
279 2 2 3 4 4 4 3 4 4 3 4 3 2 3 3 4 4 4 3 4
280 4 3 3 2 4 3 3 4 2 1 3 3 2 3 3 4 4 3 3 4
281 4 2 4 4 4 4 4 3 4 2 3 3 4 4 3 4 3 3 2 3
282 4 3 3 4 4 3 4 4 4 4 3 1 3 3 4 4 4 3 4 4