У меня есть два кадра данных: один заполняется (назовите это «A»), а другой - со справочными данными (назовите это «B»).У меня есть случайный процесс, который пытается извлечь имя из B и вставить его в A на основе определенных ограничений.Представьте, что B имеет такую структуру столбца: (имя) (данные) ... (данные) (использует оставшиеся)
«Использует оставшиеся» означает, сколько раз я могу использовать имя в кадре данных A.
Для заданного местоположения в кадре данных A процесс находит максимальное значение в столбце «использует оставшиеся» в B с учетом некоторых ограничений, которые извлекают информацию как из A, так и из B (поэтому он не всегда вытягиваетабсолютный максимум).Когда определяется максимум, имя (первый столбец) в B для этой строки максимума переносится в конкретное место в кадре данных A. После этого число 1 вычитается из значения «использует оставшееся» для этого имени в B (т.е., вы использовали имя, так что у вас осталось еще одно, которое будет использоваться в будущем).
Затем процесс повторяется для каждого значения в столбце в DF A. Всего в A есть 9 столбцов для выполненияэта операция на.Число строк варьируется, но находится где-то между 20 и 150.
Вопрос: я вынужден использовать цикл для этого процесса, или есть способ векторизации?Причина, по которой я не могу представить работу векторизации, заключается в том, что я по существу применяю различные ограничения к функции для каждого местоположения в кадре данных A, и эти ограничения меняются в зависимости от предыдущего значения в A. Хотя я хотел бы, чтобы мне сказали, что я ошибаюсь!
Я абстрагирую это, а не дословно копирую / вставляю.Происходит еще несколько вещей, но это соответствующая последовательность.Для данной строки, которая должна быть заполнена в кадре данных A, код выглядит примерно так:
#loop
for i in range(len(A)):
#determine max value in B - this part is vectorized
maxrow_in_B = B['constraints using info from both A and B'][uses\
remaining].idxmax()
#populate location in dataframe A using name from B
A.loc[i,column] = B.loc[maxrow_in_B,name]
#update B
B.loc[max,uses remaining] -= 1
Цикл работает, но для его запуска требуется несколько секунд.Я хотел бы сократить это, поскольку я буду в конечном счете использовать это в моделировании Монте-Карло, и экономия времени увеличится.Я знаю, что мне нужно конвертировать в iterrows, но я не понимаю, как я мог бы использовать векторизацию или даже функцию .apply ().Мысли оценили.Я попробовал версию этого алгоритма, которая обновляет «оставшиеся количества использований» только после заполнения всего столбца, но не обеспечивает нужную мне точность.