Панди python: застосувати функцію з аргументами до ряду


147

Я хочу застосувати функцію з аргументами до ряду в пандах python:

x = my_series.apply(my_function, more_arguments_1)
y = my_series.apply(my_function, more_arguments_2)
...

Документація описує підтримку застосувати метод, але він не приймає ніяких аргументів. Чи є інший метод, який приймає аргументи? Як варіант, я пропускаю просте рішення?

Оновлення (жовтень 2017 р.): Зауважте, що оскільки це питання було спочатку задано, що панди apply()були оновлені для обробки позиційних та ключових аргументів, а посилання на документацію вище відображає це та показує, як включити будь-який тип аргументу.


3
Чому б просто не використовувати functools.partial, або starmap?
Джоел Корнетт

Відповіді:


170

Новіші версії панд зробити дозволяють передати додаткові параметри (див нової документації ). Тож тепер ви можете:

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краще.


12
Для методу DataFrame застосовується метод приймає argsаргумент, який є кортежем, що містить додаткові позиційні аргументи, або ** kwds для названих. Я створив проблему, щоб це було також для Series.apply () github.com/pydata/pandas/isissue/1829
Wouter Overmeire

28
Функція була реалізована, буде в майбутньому випуску панди
Уес Маккінні

4
Це приємна відповідь, але перші 2/3 його справді застаріли. IMO, ця відповідь може бути добре оновлена, просто посилаючись на нову документацію плюс короткий приклад того, як користуватися аргументами позиції та / або ключовими словами. Тільки FWIW, а не критика оригінальної відповіді, просто виграє від оновленого IMO, тим більше, що це відповідь, яку часто читають.
JohnE

@watsonic Документація оновлюється і натискання старих посилань призводить до поточної документації, яка зараз дуже добре відповідає на питання.
JohnE

Примітка. Якщо, наприклад, ви передаєте один аргумент рядка 'abc', він args=('abc')буде оцінюватися як три аргументи ('a', 'b', 'c'). Щоб уникнути цього, ви повинні пропустити кортеж, що містить рядок, і для цього включіть коду:args=('abc',)
Rocky K

82

Кроки:

  1. Створіть фрейм даних
  2. Створіть функцію
  3. Використовуйте іменовані аргументи функції в операторі application.

Приклад

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" функції застосувати за допомогою аргументу ключового слова "i2".


2
Саме те, що я шукав. Зокрема, це не вимагає створення спеціальної функції просто для обробки Series (або df). Ідеально!
Коннор

Залишилося лише питання: як передати аргумент ключового слова до першого аргументу в add (i1) і повторити його з i2?
Коннор

Я думаю, що це найкраща відповідь
crypdick

43
Series.apply(func, convert_dtype=True, args=(), **kwds)

args : tuple

x = my_series.apply(my_function, args = (arg1,))

11
Дякую! Чи можете ви пояснити, чому args = (arg1,) потрібна кома після першого аргументу?
DrMisha

21
@MishaTeplitskiy, вам потрібна кома для того, щоб Python зрозумів, що вміст круглих дужок має
ворсинку

3
А як щодо введення аргументів для func. Отже, якщо я хочу застосувати, pd.Series.mean(axis=1)як я можу ввести axis=1?
Столики маленького

1
Як бічну примітку, ви також можете додати аргумент ключового слова, не використовуючи параметр <args> (наприклад: x = my_series.apply (моя_функція, ключове слово_arg = arg1), де <keyword_arg> - серед вхідних параметрів my_function)
лев

1
ця відповідь занадто коротка і нічого не пояснює
FistOfFury

23

Ви можете передавати будь-яку кількість аргументів функції, яка 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

Ця анонімна функція не дуже гнучка. Давайте створимо нормальну функцію з двома аргументами для управління значеннями min та max, які ми хочемо в нашій серії.

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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.