如何随机选择一些pandas数据帧行?

时间:2017-01-30 01:43:22

标签: python python-3.x pandas

我有一个pandas数据框df,其中包含一列amount。对于许多行,amount为零。我想随机删除amount为零的50%的行,保留amount非零的所有行。我怎么能这样做?

2 个答案:

答案 0 :(得分:3)

pandas

使用query + sample

df.drop(df.query('amount == 0').sample(frac=.5).index)

考虑数据框df

df = pd.DataFrame(dict(amount=[0, 1] * 10))

df.drop(df.query('amount == 0').sample(frac=.5).index)

numpy

iszero = df.amount.values == 0
count_zeros = iszero.sum()
idx = np.arange(iszero.shape[0])
keep_these = np.random.choice(idx[iszero], int(iszero.sum() * .5), replace=False)

df.iloc[np.sort(np.concatenate([idx[~iszero], keep_these]))]
    amount
1        1
2        0
3        1
5        1
6        0
7        1
8        0
9        1
10       0
11       1
12       0
13       1
15       1
17       1
19       1

时间测试

enter image description here

根据@tomcy的评论,您可以使用参数inplace=True删除df中的行,而无需重新分配df

df.drop(df.query('amount == 0').sample(frac=.5).index, inplace=True)
df

    amount
1        1
2        0
3        1
5        1
6        0
7        1
8        0
9        1
10       0
11       1
12       0
13       1
15       1
17       1
19       1

答案 1 :(得分:2)

@ piRSquared答案的小调整(使用布尔选择而不是查询):

df.drop( df[df.amount == 0].sample(frac=.5).index )

它大约是使用查询的两倍,但比numpy方式慢3倍。