여러 개의 인수로 함수를 적용하여 새 팬더 열 만들기


165

pandas두 개의 기존 열에 함수를 적용하여 데이터 프레임에 새 열을 만들고 싶습니다 . 이 답변에 따라 하나의 열만 인수로 필요할 때 새 열을 만들 수있었습니다.

import pandas as pd
df = pd.DataFrame({"A": [10,20,30], "B": [20, 30, 10]})

def fx(x):
    return x * x

print(df)
df['newcolumn'] = df.A.apply(fx)
print(df)

그러나 함수에 여러 인수가 필요한 경우 동일한 작업을 수행하는 방법을 알 수 없습니다. 예를 들어, 열 A와 열 B를 아래 함수에 전달하여 새 열을 작성하는 방법은 무엇입니까?

def fxy(x, y):
    return x * y

답변:


136

또는 numpy 기본 함수를 사용할 수 있습니다.

>>> import numpy as np
>>> df = pd.DataFrame({"A": [10,20,30], "B": [20, 30, 10]})
>>> df['new_column'] = np.multiply(df['A'], df['B'])
>>> df
    A   B  new_column
0  10  20         200
1  20  30         600
2  30  10         300

또는 일반적인 경우 임의의 함수를 벡터화하십시오.

>>> def fx(x, y):
...     return x*y
...
>>> df['new_column'] = np.vectorize(fx)(df['A'], df['B'])
>>> df
    A   B  new_column
0  10  20         200
1  20  30         600
2  30  10         300

2
답변 해주셔서 감사합니다! 궁금합니다. 이것이 가장 빠른 솔루션입니까?
MV23

6
벡터화 버전 np.vectorize()은 놀랍도록 빠릅니다. 감사합니다.
stackoverflowuser2010

이것은 유용한 솔루션입니다. 함수 x와 y에 대한 입력 인수의 크기가 같지 않으면 오류가 발생합니다. 이 경우 @RomanPekar 솔루션은 문제없이 작동합니다. 나는 성능을 비교하지 않았다.
Ehsan Sadr

나는 이것이 오래된 대답이라는 것을 알고 있지만, 나는 효과가없는 엣지 케이스 np.vectorize가 있습니다. 그 이유는 열 중 하나가 유형 pandas._libs.tslibs.timestamps.Timestamp이고 numpy.datetime64벡터화에 의해 유형 으로 바뀌기 때문입니다. 두 유형은 서로 바꿔 사용할 수 없으므로 기능이 제대로 작동하지 않습니다. 이것에 대한 제안? ( .apply이것은 피해야 할 것 이외 )
ElRudi

훌륭한 솔루션! 누구든지 vectorize가 문자열 비교 함수에 대해 잘 작동하고 빠르다는 것을 궁금해하는 경우.
무한

227

함수를 다시 작성할 수 있다면 @greenAfrican 예제를 사용할 수 있습니다. 그러나 함수를 다시 작성하지 않으려면 다음과 같이 apply 내부에서 익명 함수로 래핑 할 수 있습니다.

>>> def fxy(x, y):
...     return x * y

>>> df['newcolumn'] = df.apply(lambda x: fxy(x['A'], x['B']), axis=1)
>>> df
    A   B  newcolumn
0  10  20        200
1  20  30        600
2  30  10        300

4
이것은 훌륭한 팁이며 적용 호출 근처에 열 참조를 남깁니다 (실제로). 이 팁과 3 열 입력, 4 열 출력 기능을 생성하기 위해 제공된 다중 열 출력 팁 @toto_tico를 사용했습니다! 잘 작동합니다!
RufusVS

7
와우, 당신은 OP의 최소한의 예에 중점을 두지 않는 유일한 사람 인 것 같습니다. 감사합니다. 정확히 필요한 것입니다! :)
Matt

38

이것은 문제를 해결합니다 :

df['newcolumn'] = df.A * df.B

당신은 또한 할 수 있습니다 :

def fab(row):
  return row['A'] * row['B']

df['newcolumn'] = df.apply(fab, axis=1)

10
이 답변은이 장난감 예제를 해결하고 실제 함수를 다시 작성하기에 충분하지만 이전에 정의 된 함수를 참조 열에 다시 쓰지 않고 적용하는 방법은 다루지 않습니다.
Michael

23

한 번에 여러 열만들어야하는 경우 :

  1. 데이터 프레임을 만듭니다.

    import pandas as pd
    df = pd.DataFrame({"A": [10,20,30], "B": [20, 30, 10]})
  2. 함수를 작성하십시오.

    def fab(row):                                                  
        return row['A'] * row['B'], row['A'] + row['B']
  3. 새 열을 지정하십시오.

    df['newcolumn'], df['newcolumn2'] = zip(*df.apply(fab, axis=1))

1
한 번의 적용으로 여러 열을 생성하는 방법이 궁금합니다! @Roman Pekar의 답변과 함께 이것을 사용하여 3 열 입력, 4 열 출력 함수를 생성했습니다! 잘 작동합니다!
RufusVS

15

dict 스타일의 깔끔한 구문이 하나 더 있습니다.

df["new_column"] = df.apply(lambda x: x["A"] * x["B"], axis = 1)

또는,

df["new_column"] = df["A"] * df["B"]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.