【问题标题】:How to randomly drop rows in Pandas dataframe until there are equal number of values in a column?如何在 Pandas 数据框中随机删除行,直到列中的值数量相等?
【发布时间】:2019-09-23 07:58:56
【问题描述】:

我有一个数据框 pd 有两列,Xy

pd[y] 中,我有从110 的整数。但是它们有不同的频率:

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

我认为this 可能有所帮助,但分层仅保留每个标签的相同百分比,但我希望我的所有标签具有相同的频率。

以数据框为例:

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

【问题讨论】:

  • 您是否也可以添加数据框,这样我们就不必创建一个。以及预期的输出,以便更好地理解
  • @anky_91 更新

标签: python pandas numpy scikit-learn


【解决方案1】:

使用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]

【讨论】:

    猜你喜欢
    • 2018-10-04
    • 2020-12-14
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多