Вы можете использовать numpy.random.choice для генерации mask:
import numpy as np
mask = np.random.choice([True, False], size=df.shape, p=[.2,.8])
df.mask(mask)
В одной строке:
df.mask(np.random.choice([True, False], size=df.shape, p=[.2,.8]))
Протестировано с использованием timeit
при ~ 770μs:
>>> python -m timeit -n 10000
-s "import pandas as pd;import numpy as np;df=pd.DataFrame(np.ones((10,10))*2)"
"df.mask(np.random.choice([True,False], size=df.shape, p=[.2,.8]))"
10000 loops, best of 3: 770 usec per loop
Мне нравится это лучше, чем мой ответ. Чтобы сделать его более общим, вы можете использовать 'size = df.shape' вместо жесткого кодирования. – root
Спасибо @root! Добавлено в ответ. – ASGM
Я изначально толкал что-то очень похожее. Это гораздо более элегантный ответ. Я бы сказал, что на один шаг дальше, не намного лучше, но каждый бит помогает. используйте 'df.values.shape' – piRSquared