我有一个名为df
的pandas数据帧,其中包含一个名为amount
的列。对于许多行,amount
为零。我想随机删除其中 50% 的 amount
为零的行,并保留所有amount
不为零的行。如何操作?
我有一个名为df
的pandas数据帧,其中包含一个名为amount
的列。对于许多行,amount
为零。我想随机删除其中 50% 的 amount
为零的行,并保留所有amount
不为零的行。如何操作?
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
时间测试
根据@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
df.drop( df[df.amount == 0].sample(frac=.5).index )
这种方法比使用query快大约两倍,但比numpy慢3倍。
pandas
答案。有些人甚至可能更喜欢这种语法而不是 query
。 - piRSquared
inplace
parameter should beTrue
- tomcydf.drop(df[df.amount == 0].sample(frac=.5).index)
。 - JohnE