#pandas #lambda #duplicates #rename
#pandas #лямбда #дубликаты #переименовать
Вопрос:
У меня большой фрейм данных, df_vol. В нем около 20 столбцов и 500 тыс. строк. В столбце с именем «FTID» три значения равны «###». Кроме этих трех экземпляров, каждое другое значение в столбце «FTID» уникально. Я хочу искать и изменять каждый экземпляр «###», чтобы он был уникальным. Любой из этих двух вариантов будет приемлемым:
- «###1», «###2», «###3», или
- «###» str(row_index) для каждого, т.е. объедините «###» с индексом строки
Код, который я пробовал, это:
df_vol["FTID"] = df_vol["FTID"].apply(lambda x: "###" if x == "###" else None)
Я знаю, что приведенный выше код на самом деле ничего не меняет, но я не знаю, как заставить его извлекать только индекс строки или использовать инкрементное число. Я перепробовал так много разных вещей, но я новичок, и я нахожусь в темноте.
Мне кажется, это должно выглядеть так:
df_vol["FTID"] = df_vol["FTID"].apply(lambda x: "###" df_vol.index.astype(str) if x == "###" else None)
но тот небольшой успех, который у меня был, просто возвращает что-то вроде этого для новых значений:
Int64Index([ 423, 424, 425, 426, 427, 428, 429, 430,
Сейчас я соберу все свои волосы и посмотрю, смогу ли я приклеить их обратно к голове 😉
Ответ №1:
Вы можете получить доступ к индексу с x.name
помощью . Я думаю, вам нужно что-то вроде:
df_vol["FTID"] = df_vol["FTID"].apply(lambda x: f"###{x.name}" if x == "###" else x)
(Я не понял, почему вы в противном случае установили бы значение None, поскольку другие значения уникальны… Я думаю, что оно должно быть неизменным, если не равно ###
)
Редактировать: apply
работает немного по-другому при использовании для рядов и фреймов данных.
В вашем случае было бы лучше создать функцию и применить ее ко всему вашему фрейму данных:
def myfunc(row):
if row['FTID']=="###":
row['FTID'] = f"###{row.name}"
return row
df_vol = df_vol.apply(myfunc, axis=1)
Комментарии:
1. Спасибо за ответ — когда я попытался, как вы предложили, я получил ошибку: ** AttributeError: у объекта ‘str’ нет атрибута ‘name’ ** Затем я изменил {x.name } в {x.index}, и в итоге я получил результат, который выглядит следующим образом: **### <индекс встроенного метода объекта str по адресу 0x000001EF39EC3AF0> ** Все еще ломаю голову над этим. Ps. Причина, по которой у меня было «else None» в исходном сообщении, заключается в том, что я нахожусь на крутой кривой обучения 😉
2. Я вижу. Я обновил свой ответ, проверьте это!