На этот вопрос уже может быть дан ответ в виде стопки, и я просто не знаю, как лучше сформулировать этот вопрос. Но я пытаюсь просмотреть столбец (данные ["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"]
Да, извините, только что внес изменения
Это очень поможет, если вы также опубликуете пример своего списка и значений, которые нужно заменить в фрейме данных.
Кстати, вы можете рассмотреть возможность использования генератора, который прекращает поиск в списке, когда он нашел совпадение, а не всегда просматривает весь список. Просто подумал об этом.
@BernardL, не могли бы вы привести пример того, как бы вы применили генератор в этой ситуации?
На основе вашего примера вы можете использовать:
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 значений данных как в списке, так и в столбце. Этот метод, вероятно, быстрее, чем встроенный цикл (еще не сравнивал время выполнения), но можно ли улучшить свой метод, чтобы переключение было более эффективным по времени? Если да, то как бы вы это сделали?
Я вообще-то не думаю, что это займет так много времени. Что касается поиска, я не думаю, что есть много других способов сделать это быстрее. Если ваши данные относятся к вашему примеру, возможно, лучше добавить дополнительные строки к значениям столбца.
Время «Embed Loop»: 11мин 15с; Время «Применить лямбда»: 7 мин. 11 сек.
Надеюсь, это помогло. :)
Когда вы говорите "столбец", вы имеете в виду фрейм данных от pandas?