Я хочу применить функцию с аргументами к серии в python pandas:
x = my_series.apply(my_function, more_arguments_1)
y = my_series.apply(my_function, more_arguments_2)
...
В документации описывается поддержка метода apply, но он не принимает никаких аргументов. Есть ли другой метод, принимающий аргументы? Или мне не хватает простого обходного пути?
Обновление (октябрь 2017 г.): обратите внимание, что, поскольку этот вопрос был первоначально задан, pandas apply()
был обновлен для обработки позиционных и ключевых аргументов, и ссылка на документацию выше теперь отражает это и показывает, как включить любой тип аргумента.
functools.partial
, илиstarmap
?DataFrame.apply
документы иSeries.apply
документыОтветы:
Более новые версии панд сделать позволяют передать дополнительные параметры (см новой документации ). Итак, теперь вы можете:
my_series.apply(your_function, args=(2,3,4), extra_kw=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
лучше использовать.источник
args
аргумент, который является кортежем, содержащим дополнительные позиционные аргументы или ** kwds для именованных. Я создал проблему, чтобы иметь это также для Series.apply () github.com/pydata/pandas/issues/1829'abc'
, один строковый аргумент , онargs=('abc')
будет оцениваться как три аргумента('a', 'b', 'c')
. Чтобы избежать этого, вы должны передать кортеж, содержащий строку, и для этого включить запятую в конце:args=('abc',)
Шаги:
пример
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. Первый параметр будет значением во фрейме данных, а второй - тем, что мы передаем функции «apply». В этом случае мы передаем «9» функции apply с помощью ключевого слова аргумент «i2».
источник
Series.apply(func, convert_dtype=True, args=(), **kwds) args : tuple x = my_series.apply(my_function, args = (arg1,))
источник
func
. Итак, если я хочу подать заявку,pd.Series.mean(axis=1)
как мне вставитьaxis=1
?Вы можете передать любое количество аргументов
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)
источник