Как случайным образом удалить строки в кадре данных Pandas, пока в столбце не появится равное количество значений? - PullRequest
2 голосов
/ 05 мая 2019

У меня есть фрейм данных pd с двумя столбцами, X и y.

В pd[y] у меня есть целые числа от 1 до 10 включительно. Однако они имеют разные частоты:

df[y].value_counts()


10    6645
9     6213
8     5789
7     4643
6     2532
5     1839
4     1596
3      878
2      815
1      642

Я хочу урезать свой фрейм данных, чтобы для каждой метки было одинаковое количество вхождений. Поскольку я хочу равное количество каждой метки, минимальная частота составляет 642. Поэтому я хочу сохранить только 642 случайно выбранных строк каждой метки класса в моем фрейме данных, чтобы мой новый фрейм данных имел 642 для каждой метки класса.

Я думал, что этот мог бы помочь, однако стратификация сохраняет только один процент от каждой метки, но я хочу, чтобы все мои метки имели одинаковую частоту.

Как пример кадра данных:

df = pd.DataFrame()
df['y'] = sum([[10]*6645, [9]* 6213,[8]* 5789, [7]*4643,[6]* 2532, [5]*1839,[4]* 1596,[3]* 878, [2]*815, [1]* 642],[])
df['X'] = [random.choice(list('abcdef')) for i in range(len(df))]

1 Ответ

4 голосов
/ 05 мая 2019

Использование pd.sample с groupby -

df = pd.DataFrame(np.random.randint(1, 11, 100), columns=['y'])
val_cnt = df['y'].value_counts()
min_sample = val_cnt.min()
print(min_sample) # Outputs 7 in as an example
print(df.groupby('y').apply(lambda s: s.sample(min_sample)))

Выход

        y
y        
1  68   1
   8    1
   82   1
   17   1
   99   1
   31   1
   6    1
2  55   2
   15   2
   81   2
   22   2
   46   2
   13   2
   58   2
3  2    3
   30   3
   84   3
   61   3
   78   3
   24   3
   98   3
4  51   4
   86   4
   52   4
   10   4
   42   4
   80   4
   53   4
5  16   5
   87   5
...    ..
6  26   6
   18   6
7  56   7
   4    7
   60   7
   65   7
   85   7
   37   7
   70   7
8  93   8
   41   8
   28   8
   20   8
   33   8
   64   8
   62   8
9  73   9
   79   9
   9    9
   40   9
   29   9
   57   9
   7    9
10 96  10
   67  10
   47  10
   54  10
   97  10
   71  10
   94  10

[70 rows x 1 columns]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...