У меня есть кадр данных панд с двумя столбцами. Мне нужно изменить значения первого столбца, не затрагивая второй, и получить обратно весь фрейм данных только с измененными значениями первого столбца. Как я могу сделать это, используя apply в пандах?
python
pandas
dataframe
python-3.5
Амани
источник
источник
apply
в такой ситуации. Вместо этого используйте столбец напрямую.apply
как можно больше. Если вы не уверены, что вам нужно его использовать, скорее всего, нет. Я рекомендую взглянуть на то, когда я хочу использовать pandas apply () в своем коде? ,Ответы:
Дан примерный кадр данных
df
как:что вы хотите это:
что возвращает:
источник
apply
никогда не должен использоваться в такой ситуацииapply
использует внутренний цикл над строками, который намного медленнее, чем векторизованные функции, например, напримерdf.a = df.a / 2
(см. Ответ Mike Muller).Для одного столбца лучше использовать
map()
, например так:источник
map()
лучше, чемapply()
для одного столбца?df['file_name'] = df['Path'].map(lambda a: os.path.basename(a))
Вам не нужна функция вообще. Вы можете работать над целым столбцом напрямую.
Пример данных:
Половина всех значений в столбце
a
:источник
Хотя данные ответы являются правильными, они изменяют начальный фрейм данных, что не всегда желательно (и, учитывая, что OP запросил примеры «использования
apply
», возможно, им нужна версия, которая возвращает новый фрейм данных, как этоapply
происходит).Это возможно с помощью
assign
: он действителен дляassign
существующих столбцов, как указано в документации (выделено мое):Коротко:
Обратите внимание, что функции будет передан весь фрейм данных, а не только столбец, который вы хотите изменить, поэтому вам нужно будет убедиться, что вы выбрали правильный столбец в своей лямбде.
источник
Если вы действительно обеспокоены скоростью выполнения вашей функции применения, и у вас есть огромный набор данных для работы, вы можете использовать swifter для ускорения выполнения, вот пример для swifter на панде dataframe:
Это позволит всем ядрам процессора вычислять результат, следовательно, это будет намного быстрее, чем обычные применяемые функции. Попробуйте и дайте мне знать, если это станет полезным для вас.
источник
Позвольте мне попробовать сложное вычисление, используя datetime и принимая во внимание нули или пустые места. Я сокращаю 30 лет для столбца datetime и использую
apply
метод, а такжеlambda
конвертирую формат datetime. Lineif x != '' else x
позаботится обо всех пустых местах или нулях соответственно.источник