如何基于条件从Pandas数据帧中随机删除特定数量的行?

3
我想从数据框中删除特定的'n'行,其中要删除的行是随机选择的。此外,它必须根据特定列值上的条件选择行。
例如,我的数据框如下:
C1    C2    C3
1     0     a
2     1     b
3     0     c
4     0     d
5     0     e
6     1     f
7     1     g
8     1     h
9     0     i

现在,我想随机删除符合条件 C2==1n=2 行。
结果数据框如下:
C1    C2    C3
1     0     a
3     0     c
4     0     d
5     0     e
6     1     f
8     1     h
9     0     i

或者

C1    C2    C3
1     0     a
2     1     b
3     0     c
4     0     d
5     0     e
7     1     g
9     0     i

或者可能还有其他的选择。
这个问题在这里展示如何随机删除“n”个句子,但它并没有提供条件。

1个回答

4

使用布尔索引通过DataFrame.sample按随机行筛选行,最后使用drop

N = 2
df1 = df.drop(df[df['C2'].eq(1)].sample(N).index)
print (df1)
   C1  C2 C3
0   1   0  a
1   2   1  b
2   3   0  c
3   4   0  d
4   5   0  e
6   7   1  g
8   9   0  i

或使用np.random.choice来生成随机索引值:

df = df.drop(np.random.choice(df.index[df['C2'].eq(1)], N))

尝试了两种方法,df1 = df.drop(df[df['C2'].eq(1)].sample(N).index) 可以正常工作。但是 df = df.drop(np.random.choice(df.index[df['C2'].eq(1)], N)) 不行。 - Ashwin Geet D'Sa
@AshwinGeetD'Sa - 你能再解释一下吗? - jezrael
1
我有89609列数据,其中有一列只包含0和1两个值。我的意图是对数据进行下采样。C2==0的行数为73462,C2==1的行数为16147。我尝试随机删除(73462-16147)=>57315行,其中C2==0。使用df1 = df.drop(df[df['C2'].eq(1)].sample(N).index),我得到了32294行,这正是我想要的,数据看起来很好。但是如果使用df.drop(np.random.choice(df.index[df['C2'].eq(1)], N)),我得到了49667行。 - Ashwin Geet D'Sa
1
无论如何,我已经为你的答案点赞了。鉴于只有第一部分回答,我也会接受它。 - Ashwin Geet D'Sa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接