Python 如何在数据帧中随机删除行,直到列中的值数相等为止?

Python 如何在数据帧中随机删除行,直到列中的值数相等为止?,python,pandas,numpy,scikit-learn,Python,Pandas,Numpy,Scikit Learn,我有一个带有两列的数据框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。因此,我只想在我的数据框中随机地保

我有一个带有两列的数据框
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))]
与-

输出

        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]

你也可以添加数据框,这样我们就不必创建数据框了。预期产量也会有所提高understanding@anky_91更新
        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]