我有“数据不平衡”的问题。二进制分类中有99%的是和1%的否。在这里,我想删除某些行以表明yes = 1,以平衡数据比例。但是由于我对python的了解并不深,所以我只能删除指示条件的整个行。 谁能为我的数据框建议语法,比如说“仅删除yes = 1的10000行”?
谢谢。
最诚挚的问候
答案 0 :(得分:3)
您可以选择顶部索引值,并DataFrame.drop
:
np.random.seed(2019)
N = 20
df = pd.DataFrame({'a':np.random.choice([0,1], N)})
#remove top 5 values matched condition
M = 5
idx = df.index.values[df['a'] == 1][:M]
df = df.drop(idx)
print (df)
a
0 0
1 0
4 0
5 0
6 0
7 0
10 0
11 0
12 0
13 0
15 0
16 1
17 1
18 0
19 0
另一种解决方案是通过Series.cumsum
创建掩码,使用~
通过反掩码链接,并通过boolean indexing
进行过滤:
M = 5
mask = (df['a'] == 1)
df = df[(mask.cumsum() > M) | ~mask]
print (df)
a
0 0
1 0
4 0
5 0
6 0
7 0
10 0
11 0
12 0
13 0
15 0
16 1
17 1
18 0
19 0