Я пытаюсь векторизовать цикл, который заменяет значения в кадре данных (df) на основе значений в другом кадре данных (df_override). Для каждой строки в df_override мы находим соответствие столбца «name» в df и заменяем его столбец «Field» новым значением, указанным в «New Value». Существует оператор if, который соответствует другому столбцу, если name является целым числом.
У меня есть две записанные петли, которые делают это. Однако цель состоит в том, чтобы максимально улучшить производительность. Старый медленнее, поскольку использует iterrows, поэтому я перешел к циклу np. Я надеюсь векторизовать этот цикл для дальнейшего улучшения времени выполнения, но я не могу думать, как действовать дальше.
Старый цикл (медленный)
for index, row in df_override.iterrows():
if(not str(row["name"]).isdigit()):
df.loc[df["name"] == row["name"], row["Field"]] = row["New Value"]
else:
df.loc[df["id"] == row["name"], row["Field"]] = row["New Value"]
Новый цикл (быстрее)
fields = df_override["Field"].values
names = df_override["name"].values
values = df_override["New Value"].values
for field, name, value in zip(fields, names, values):
if not str(name).isdigit():
df[field] = np.where(df["name"] == name, df[field], value)
else:
df[field] = np.where(df["id"] == name, df[field], value)
Не работает (из-за сравнения, и кажется, что выбор полей работает не так, как задумано)
fields = df_override["Field"].values
names = df_override["name"].values
values = df_override["New Value"].values
#Trying without the if statement here
df[fields] = np.where(df["name"] == names, df[fields], values)
Пример данных
df_override
"name" "Field" "New Value"
apple color red
100 is_number True
df
"name" "id" "color" "is_number"
apple 300 blue False
apple 200 yellow False
banana 100 green False
df (after processing)
"name" "id" "color" "is_number"
apple 300 red False
apple 200 red False
banana 100 green True