Векторизация сравнений и выбор столбцов для производительности - PullRequest
1 голос
/ 30 мая 2019

Я пытаюсь векторизовать цикл, который заменяет значения в кадре данных (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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...