Замена значений в столбце с использованием значений в списке

На этот вопрос уже может быть дан ответ в виде стопки, и я просто не знаю, как лучше сформулировать этот вопрос. Но я пытаюсь просмотреть столбец (данные ["Id"]) в DataFrame (данные), который содержит неполные строки, и заменить их завершенными версиями, которые есть у меня в списке.

Я не могу сразу переключиться, просто переназначив значения столбца значениям списка, потому что значения в столбце упорядочены случайным образом и связаны с другими важными значениями столбца в фрейме данных.

Я пробовал это сделать:

for img_name in images_list:
    for label in data["Id"]:
        if label in img_name:
            data["Id"] = data["Id"].replace(label,img_name)

Но мои значения списка и значения столбцов довольно большие (по 120 000 каждое), поэтому этот метод займет вечность. Мне было интересно, знает ли кто-нибудь лучший способ решить эту проблему? Я заранее извиняюсь, если этот вопрос является избыточным, и был бы очень признателен за ссылку, которая отвечает на этот вопрос.

Пример списка:

["0img1_type1.png", "1img1_type2.png", "2img1_type3.png"]

data ["Id"] Пример:

["0img1", "1img1", "2img1"]

Когда вы говорите "столбец", вы имеете в виду фрейм данных от pandas?

PL200 26.10.2018 06:06

Да, извините, только что внес изменения

Glenn G. 26.10.2018 06:09

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

BernardL 26.10.2018 06:23

Кстати, вы можете рассмотреть возможность использования генератора, который прекращает поиск в списке, когда он нашел совпадение, а не всегда просматривает весь список. Просто подумал об этом.

BernardL 26.10.2018 07:42

@BernardL, не могли бы вы привести пример того, как бы вы применили генератор в этой ситуации?

Glenn G. 26.10.2018 17:58
1
5
1 353
1

Ответы 1

На основе вашего примера вы можете использовать:

df = pd.DataFrame([["0img1","1img1","2img1"]]).T
df.columns = ['id']

l = ["0img1_type1.png","1img1_type2.png","2img1_type3.png"]
l = set(l)

df['id'] = df['id'].apply(lambda x: [i for i in l if x in i][0])
df

Он в основном извлекает первое значение из вашего списка, которое соответствует подстроке в значениях столбца. Для более быстрого поиска лучше преобразовать ваш list в set.

Я пытаюсь использовать этот метод, но замечаю проблему, аналогичную предыдущему методу, с точки зрения времени выполнения. У меня 120 000 значений данных как в списке, так и в столбце. Этот метод, вероятно, быстрее, чем встроенный цикл (еще не сравнивал время выполнения), но можно ли улучшить свой метод, чтобы переключение было более эффективным по времени? Если да, то как бы вы это сделали?

Glenn G. 26.10.2018 06:55

Я вообще-то не думаю, что это займет так много времени. Что касается поиска, я не думаю, что есть много других способов сделать это быстрее. Если ваши данные относятся к вашему примеру, возможно, лучше добавить дополнительные строки к значениям столбца.

BernardL 26.10.2018 07:06

Время «Embed Loop»: 11мин 15с; Время «Применить лямбда»: 7 мин. 11 сек.

Glenn G. 26.10.2018 07:23

Надеюсь, это помогло. :)

BernardL 26.10.2018 07:24

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