Обновление нескольких столбцов одновременно с помощью iloc

Как я могу обновить несколько столбцов строки более оптимизированным способом?

masks_df.iloc[mask_row.Index, shelf_number_idx] = tags_on_mask['shelf_number'].iloc[0]
masks_df.iloc[mask_row.Index, stacking_layer_idx] = tags_on_mask['stacking_layer'].iloc[0]
masks_df.iloc[mask_row.Index, facing_sequence_number_idx] = tags_on_mask['facing_sequence_number'].iloc[0]

Спасибо.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
84
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Использовать:

tags_on_mask = pd.DataFrame({
        'A':list('ab'),
         'facing_sequence_number':[30,5],
         'stacking_layer':[70,8],
         'col_2':[5,7],
         'shelf_number':[50,3],
})

print (tags_on_mask)
   A  facing_sequence_number  stacking_layer  col_2  shelf_number
0  a                      30              70      5            50
1  b                       5               8      7             3

np.random.seed(100)
masks_df = pd.DataFrame(np.random.randint(10, size=(5,5)), columns=tags_on_mask.columns)
print (masks_df)
   A  facing_sequence_number  stacking_layer  col_2  shelf_number
0  8                       8               3      7             7
1  0                       4               2      5             2
2  2                       2               1      0             8
3  4                       0               9      6             2
4  4                       1               5      3             4

shelf_number_idx = 1
stacking_layer_idx = 2
facing_sequence_number_idx = 3

pos = [shelf_number_idx, stacking_layer_idx, facing_sequence_number_idx]
cols = ['shelf_number','stacking_layer','facing_sequence_number']

Вы можете передать список в функцию iloc и преобразовать первые значения столбца в массив numpy с помощью первого выбора, но производительность не увеличится (на мой взгляд, только более читаемый код):

masks_df.iloc[3, pos] = tags_on_mask[cols].values[0, :]

Для повышения производительности можно использовать DataFrame.iat:

masks_df.iat[2, shelf_number_idx] = tags_on_mask['shelf_number'].values[0]
masks_df.iat[2, stacking_layer_idx] = tags_on_mask['stacking_layer'].values[0]
masks_df.iat[2, facing_sequence_number_idx] = tags_on_mask['facing_sequence_number'].values[0]

Или:

for i, c in zip(pos, cols):
    masks_df.iat[2, i] = tags_on_mask[c].values[0]

print (masks_df)
   A  facing_sequence_number  stacking_layer  col_2  shelf_number
0  8                       8               3      7             7
1  0                       4               2      5             2
2  2                      50              70     30             8
3  4                      50              70     30             2
4  4                       1               5      3             4

In [97]: %%timeit
    ...: pos = [shelf_number_idx, stacking_layer_idx, facing_sequence_number_idx]
    ...: cols = ['shelf_number','stacking_layer','facing_sequence_number']
    ...: vals = tags_on_mask[cols].values[0, :]
    ...: masks_df.iloc[3, pos] = vals
    ...: 
2.34 ms ± 33.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [98]: %%timeit
    ...: masks_df.iat[2, shelf_number_idx] = tags_on_mask['shelf_number'].values[0]
    ...: masks_df.iat[2, stacking_layer_idx] = tags_on_mask['stacking_layer'].values[0]
    ...: masks_df.iat[2, facing_sequence_number_idx] = tags_on_mask['facing_sequence_number'].values[0]
    ...: 
34.1 µs ± 1.99 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

In [100]: %%timeit
     ...: for i, c in zip(pos, cols):
     ...:     masks_df.iat[2, i] = tags_on_mask[c].values[0]
     ...: 
33.1 µs ± 250 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

Другие вопросы по теме