Python pandas: применить функцию с аргументами к ряду
Я хочу применить функцию с аргументами к ряду в python pandas:
x = my_series.apply(my_function, more_arguments_1)
y = my_series.apply(my_function, more_arguments_2)
...
Документация описывает поддержку метода apply, но не принимает никаких аргументов. Есть ли другой метод, который принимает аргументы? В качестве альтернативы, я пропустил простой обходной путь?
Обновление (октябрь 2017 г.): Обратите внимание, что поскольку этот вопрос изначально был запрошен, чтобы pandas apply()
был обновлен для обработки аргументов positional и keyword, а ссылка на документацию выше отражает это и показывает как включить любой тип аргумента.
Ответы
Ответ 1
Документация объясняет это четко. Метод apply принимает функцию python, которая должна иметь один параметр. Если вы хотите передать больше параметров, вы должны использовать functools.partial
, как предложил Джоэл Корнетт в своем комментарии.
Пример:
>>> import functools
>>> import operator
>>> add_3 = functools.partial(operator.add,3)
>>> add_3(2)
5
>>> add_3(7)
10
Вы также можете передавать аргументы ключевого слова с помощью partial
.
Другой способ - создать лямбда:
my_series.apply((lambda x: your_func(a,b,c,d,...,x)))
Но я думаю, что лучше использовать partial
.
Обратите внимание, что более новые версии pandas позволяют вам передавать дополнительные аргументы (см. новую документацию). Итак, теперь вы можете сделать:
my_series.apply(your_function, args=(2,3,4), extra_kw=1)
Позиционные аргументы добавляются после элемента серии.
Ответ 2
Series.apply(func, convert_dtype=True, args=(), **kwds)
args : tuple
x = my_series.apply(my_function, args = (arg1,))
Ответ 3
Шаги:
- Создание фрейма данных
- Создать функцию
- Использовать именованные аргументы функции в инструкции apply.
Пример
x=pd.DataFrame([1,2,3,4])
def add(i1, i2):
return i1+i2
x.apply(add,i2=9)
Результатом этого примера является то, что каждое число в фрейме будет добавлено к номеру 9.
0
0 10
1 11
2 12
3 13
Объяснение:
Функция "добавить" имеет два параметра: i1, i2. Первым параметром будет значение в кадре данных, а второе - это то, что мы передаем в функцию "применить". В этом случае мы передаем "9" в функцию apply, используя аргумент ключевого слова "i2".
Ответ 4
Вы можете передать любое количество аргументов функции, которую apply
вызывает через неименованные аргументы, переданные как кортеж в параметр args
, или через другие аргументы ключевых слов, встроенные внутри словаря kwds
параметр.
Например, создайте функцию, возвращающую значение True для значений между 3 и 6, а False - в противном случае.
s = pd.Series(np.random.randint(0,10, 10))
s
0 5
1 3
2 1
3 1
4 6
5 0
6 3
7 4
8 9
9 6
dtype: int64
s.apply(lambda x: x >= 3 and x <= 6)
0 True
1 True
2 False
3 False
4 True
5 False
6 True
7 True
8 False
9 True
dtype: bool
Эта анонимная функция не очень гибкая. Пусть создана нормальная функция с двумя аргументами для управления минимальными и максимальными значениями, которые мы хотим в нашей серии.
def between(x, low, high):
return x >= low and x =< high
Мы можем реплицировать вывод первой функции, передавая неназванные аргументы в args
:
s.apply(between, args=(3,6))
Или мы можем использовать именованные аргументы
s.apply(between, low=3, high=6)
Или даже комбинация обоих
s.apply(between, args=(3,), high=6)