Используйте DataFrame row.index в качестве входных данных для результата лямбда-функции

#pandas #lambda #duplicates #rename

#pandas #лямбда #дубликаты #переименовать

Вопрос:

У меня большой фрейм данных, df_vol. В нем около 20 столбцов и 500 тыс. строк. В столбце с именем «FTID» три значения равны «###». Кроме этих трех экземпляров, каждое другое значение в столбце «FTID» уникально. Я хочу искать и изменять каждый экземпляр «###», чтобы он был уникальным. Любой из этих двух вариантов будет приемлемым:

  1. «###1», «###2», «###3», или
  2. «###» 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. Я вижу. Я обновил свой ответ, проверьте это!