Я пытаюсь создать код, который как можно быстрее может обновлять большое количество значений панд одновременно на основе значений столбца идентификатора. Код, который я использую atm, вставляет несколько строк одновременно на основе ID_column, но не может вставлять несколько столбцов + строк одновременно.
Приведенный ниже код является упрощенным примером, который обновляет 2 столбца (значение1 и значение2) на основе значения идентификатора имени столбца.
id_list = [24,26,28]
value1_list =[100,200,300]
value2_list =[125,175,165]
df.loc[df['id'].isin(id_list), 'value1'] = value1_list
df.loc[df['id'].isin(id_list), 'value2'] = value2_list
Код, который я бы в идеале использовал, работал бы примерно так:
df.loc[df['id'].isin(id_list), ['value1','value2']] = [value1_list,value2_list]
Значение как столбца value1, так и столбца value2 будет обновлено одновременно. Это выполнимо?
Вы можете создать один массив NumPy через np.vstack
а затем назначить его нескольким столбцам:
import numpy as np
mask = df['id'].isin(id_list)
value_array = np.vstack((value1_list, value2_list)).T
df.loc[mask, ['value1', 'value2']] = value_array
print(df)
# id value1 value2
# 0 24 100 125
# 1 26 200 175
# 2 28 300 165
# 3 30 4 8
Кроме того, вы можете zip
ваши входные списки:
df.loc[mask, ['value1', 'value2']] = list(zip(*(value1_list,value2_list)))
Вы также можете использовать словарь для ввода столбцов, соответствующих их обновлениям.
mask = df['id'].isin(id_list)
dc = {'value1': value1_list, 'value2': value2_list}
for i, j in dc.items():
df.loc[mask, i] = j
value1
быть если не в value1_list? то же самое дляvalue2