Случайный выбор определенных значений DF - PullRequest
0 голосов
/ 16 февраля 2019

У меня большой df с 17520 строками и 1000 столбцами.У df есть только два значения [0,0.05].Я хотел бы перейти к каждой ячейке df со значением 0,05 и изменить его на случайное значение.Случайное значение может быть только 0 или 0,05.

Я попробовал следующую строку кода:

 y = np.array([0,0.05])
 df.replace(0.05,np.random.choice(y))

Однако он выполняет одинаковый случайный выбор для всех ячеек со значением0,05, и я хотел бы иметь другой случайный выбор для каждой ячейки со значением 0,05.Я пробовал цикл for, но это занимает слишком много времени, примерно 20 минут.Мне нужно повторить эксперимент около 100 раз.
По этой причине я хотел бы знать, есть ли более эффективный способ сделать это.

Буду признателен за вашу помощь.

1 Ответ

0 голосов
/ 16 февраля 2019

Вместо зацикливания вы можете использовать df.update() вот так, чтобы получить ускорение> 20x:

df = pd.DataFrame(np.random.choice([0, 0.05], size=(4000, 1000)))
 %timeit df.update(np.random.choice([0, 0.05], size=df.shape), filter_func=lambda x: x==0.05)
#498 ms ± 19.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
df = pd.DataFrame(np.random.choice([0, 0.05], size=(4000, 1000)))
%timeit df.applymap(lambda x: np.random.choice([0, 0.05]) if x == 0.05 else 0)
#9.66 s ± 634 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

Я заметил, что ускорение увеличивается только длябольшие и большие кадры данных, но уже здесь applymap заняло так много времени, что я решил не увеличивать размер DataFrame дальше.

Как это работает

df = pd.DataFrame(np.random.choice([0, 0.05], size=(1000, 1000)))
print(df.tail(2))
df.update(np.random.choice([0, 0.05], size=df.shape), filter_func=lambda x: x==0.05)
print(df.tail(2))
#      0     1     2    3     4     5   ...   994   995   996   997   998  999
#998  0.00  0.05  0.05  0.0  0.05  0.05 ...   0.0  0.05  0.05  0.05  0.05  0.0
#999  0.05  0.00  0.05  0.0  0.05  0.05 ...   0.0  0.05  0.05  0.05  0.00  0.0
#
#[2 rows x 1000 columns]
#      0     1     2    3     4     5   ...   994   995   996  997   998  999
#998  0.00  0.05  0.00  0.0  0.05  0.05 ...   0.0  0.05  0.05  0.0  0.05  0.0
#999  0.05  0.00  0.05  0.0  0.05  0.00 ...   0.0  0.00  0.05  0.0  0.00  0.0
#
#[2 rows x 1000 columns]

С update вы можетеизменить выбранные значения из DataFrame.Чтобы выбрать значения (по умолчанию np.nan), используйте filter_func= lambda x: x==0.05, а затем создайте DataFrame того же размера, что и исходный DataFrame, со случайным выбором из [0, 0.05].Затем он выбирает значения из исходного DataFrame, где значение было 0.05, и заменяет его случайным значением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...