繁体   English   中英

如何随机删除Pandas数据框中的行,直到一列中值的数量相等?

[英]How to randomly drop rows in Pandas dataframe until there are equal number of values in a column?

我有一个带有两列Xy的数据框pd

pd[y]我的整数从110110 但是它们具有不同的频率:

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))]

pd.samplegroupby 一起使用-

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]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM