파이썬 팬더 : 시리즈에 인수가있는 함수 적용


147

파이썬 팬더의 시리즈에 인수가있는 함수를 적용하고 싶습니다.

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

문서 는 apply 메소드 지원에 대해 설명하지만 인수를 허용하지 않습니다. 인수를 받아들이는 다른 방법이 있습니까? 또는 간단한 해결 방법이 누락 되었습니까?

업데이트 (2017 년 10 월) : 이 질문은 원래 팬더 apply()가 위치 및 키워드 인수를 처리하도록 업데이트되었으므로 위의 문서 링크는이를 반영하고 두 유형의 인수를 포함하는 방법을 보여줍니다.


3
왜 그냥 사용 functools.partial, 또는 starmap?
Joel Cornett

답변:


170

팬더의 최신 버전은 어떻게 당신이 여분의 인수를합니다 (참조 전달할 수 있도록 새 문서 ). 이제 할 수 있습니다 :

my_series.apply(your_function, args=(2,3,4), extra_kw=1)

위치 인수는 시리즈의 요소 뒤에 추가됩니다 .


이전 버전의 팬더 :

설명서에서이를 명확하게 설명합니다. apply 메소드는 단일 매개 변수를 가져야하는 python 함수를 승인합니다. 더 많은 매개 변수를 전달하려면 functools.partialJoel Cornett의 의견에 따라 제안 해야합니다 .

예를 들면 :

>>> 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 apply 메소드의 경우 args인수를 사용할 수 있습니다. 인수는 추가 위치 인수 또는 명명 된 인수에 대한 ** kwds를 보유하는 튜플입니다. 나는 또한 Series.apply () github.com/pydata/pandas/issues/1829에
Wouter Overmeire

28
기능이 구현되었으며, 곧 판다 출시 예정
Wes McKinney

4
이것은 좋은 대답이지만 첫 번째 2/3는 실제로 더 이상 사용되지 않습니다. IMO,이 답변은 새로운 문서에 대한 링크와 위치 및 / 또는 키워드 인수와 함께 사용하는 방법에 대한 간단한 예를 통해 멋지게 업데이트 될 수 있습니다. 원래 답변에 대한 비판이 아니라 FWIW 일뿐입니다. 특히 자주 읽는 답변이기 때문에 업데이트 IMO의 이점이 있습니다.
JohnE

@watsonic 문서가 업데이트 된 후 이전 링크를 클릭하면 현재 문서로 연결되어 질문에 대한 답을 얻습니다.
JohnE

참고 : 예를 들어, 하나의 문자열 인수를 전달하는 경우 'abc', 다음 args=('abc')세 가지 인자로 평가됩니다 ('a', 'b', 'c'). 이를 피하려면 문자열이 포함 된 튜플을 전달해야하며,이를 위해서는 뒤에 쉼표를 포함시켜야합니다.args=('abc',)
Rocky K

82

단계 :

  1. 데이터 프레임 생성
  2. 함수 만들기
  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

설명:

"add"기능에는 i1, i2의 두 매개 변수가 있습니다. 첫 번째 매개 변수는 데이터 프레임의 값이되고 두 번째 매개 변수는 "적용"기능에 전달하는 것입니다. 이 경우 키워드 인수 "i2"를 사용하여 "9"를 적용 함수에 전달합니다.


2
정확히 내가 찾던 것. 특히, 이것은 Series (또는 df)를 처리하기 위해 사용자 정의 함수를 만들 필요가 없습니다. 완전한!
Connor

남은 유일한 질문은 : add (i1)의 첫 번째 인수에 키워드 인수를 전달하고 i2로 반복하는 방법입니다.
Connor

이것이 가장 좋은 답변이라고 생각합니다
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, 파이썬이 괄호의 내용을 길이 1의 튜플로 이해하려면 쉼표가 필요합니다.
prooffreader

3
에 대한 인수를 넣는 것은 어떻습니까 func. pd.Series.mean(axis=1)어떻게 적용하고 싶으면 axis=1?
리틀 바비 테이블

1
참고로 <args> 매개 변수를 사용하지 않고 키워드 인수를 추가 할 수도 있습니다 (예 : x = my_series.apply (my_function, keyword_arg = arg1). 여기서 <keyword_arg>는 my_function의 입력 매개 변수 중 하나임)
lev

1
이 답변은 너무 짧아 아무것도 설명하지 않습니다
FistOfFury

23

apply명명되지 않은 인수를 통해 호출 args하거나 매개 변수에 튜플로 전달 하거나 kwds매개 변수에 의해 사전으로 내부적으로 캡처 된 다른 키워드 인수를 통해 호출 하는 함수에 여러 개의 인수를 전달할 수 있습니다 .

예를 들어, 3에서 6 사이의 값에 대해서는 True를, 그렇지 않으면 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

이 익명의 기능은 매우 유연하지 않습니다. Series에서 원하는 최소값과 최대 값을 제어하기 위해 두 개의 인수로 정규 함수를 만들어 봅시다.

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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.