Как минимизировать время выполнения: итерации замены значений в Pandas - PullRequest
1 голос
/ 29 мая 2019

У меня есть фрейм данных с именем df_override, который содержит столбцы «name», «Field» и «New Value».Цель этого цикла - заменить все совпадения «name» в столбце «Поле» df-файла в «New Value».Оператор if должен видеть, является ли оно целым числом, тогда вместо этого он будет соответствовать столбцу id.

Этот цикл работает нормально, но с большим фреймом данных он становится невероятно медленным.У меня есть несколько других циклов for, которые запускаются так же позже в этой функции.Мне интересно, есть ли другой способ выполнить эту функцию, которая оптимизирована для времени выполнения?

Спасибо.

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"]

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

1 Ответ

0 голосов
/ 30 мая 2019

Изменение значения вместо iterrow улучшило производительность, но все еще медленно.

Новый цикл

for field, name, value in zip(df_override["Field"].values,df_override["name"].values,df_override["New Value"].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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...