将每行10个随机非零值的值设置为零



我有一个非常稀疏的Pandas DataFrame,大约有1000行和10000列。大多数行只包含20-100个非零值。我现在想在每行中选择任意10个随机的非零值,并将它们的值设置为0。

这是我的第一次尝试(非常不适合熊猫(:

for i in range(df.shape[0]):
row = df.iloc[i]
nonZeros = np.where(row > 0)[0]
rand = np.random.choice(nonZeros, 10)
for j in rand:
df.iloc[i, j] = 0

类似的东西?

def setrandom(x):
counter=10
while counter>0:
randindex = np.random.randint(1,10000)
if x[randindex] !=0:
x[randindex] = 0
counter -=1        
return x
df = df.apply(setrandom, axis=1)

这并不是一种最佳的方法,尤其是因为您的数据帧是稀疏的!

编辑的答案

您可以使用以下代码:

df_with_more_zeros = df.apply(lambda x: x.replace(to_replace=x[x!=0].sample(10), value=0), axis=1)

也许不是最快的方式,但对熊猫更友好一点的

最新更新