if-elif-else 조건을 기반으로 새 열 만들기


103

DataFrame이 있습니다 df.

    A    B
a   2    2 
b   3    1
c   1    3

다음 기준에 따라 새 열을 만들고 싶습니다.

행인 경우 A == B: 0

행인 경우A > B: 1

행인 경우 A < B: -1

따라서 위의 표가 주어지면 다음과 같아야합니다.

    A    B    C
a   2    2    0
b   3    1    1
c   1    3   -1 

일반적인 if else경우에 np.where(df.A > df.B, 1, -1)pandas는 한 단계로 문제를 해결하기위한 특수 구문을 제공 합니까 (3 개의 새 열을 만든 다음 결과를 결합 할 필요가 없음)?


함수를 정의하고 이것을 전달 apply하고 설정 axis=1하면 작동하지만 원하는 것을 제공하는 작업을 생각할 수 있는지 확실하지 않습니다.
EdChum

귀하의 솔루션은 3 개의 열을 만들고이를 1 개의 열로 결합하는 것을 의미합니까, 아니면 다른 것을 염두에두고 있습니까?
nutship

"3 개의 열 생성"이라고 계속 말하지만 무엇을 말하는지 잘 모르겠습니다.
DSM

1
@DSM이 질문에 대답했지만 내가 좋아하는 뭔가 의미 df['C']=df.apply(myFunc(row), axis=1)MYFUNC 당신이,이 '3 열'작성 포함되지 않습니다 원하는 것을 곳
EdChum

답변:


152

위에 제시된 접근 방식 중 일부를 공식화하려면 :

다음과 같이 데이터 프레임의 행에서 작동하는 함수를 만듭니다.

def f(row):
    if row['A'] == row['B']:
        val = 0
    elif row['A'] > row['B']:
        val = 1
    else:
        val = -1
    return val

그런 다음 axis=1옵션을 전달하는 데이터 프레임에 적용하십시오 .

In [1]: df['C'] = df.apply(f, axis=1)

In [2]: df
Out[2]:
   A  B  C
a  2  2  0
b  3  1  1
c  1  3 -1

물론 이것은 벡터화되지 않으므로 많은 수의 레코드로 확장 할 때 성능이 좋지 않을 수 있습니다. 그래도 훨씬 더 읽기 쉽다고 생각합니다. 특히 SAS 배경에서 왔습니다.

편집하다

다음은 벡터화 된 버전입니다.

df['C'] = np.where(
    df['A'] == df['B'], 0, np.where(
    df['A'] >  df['B'], 1, -1)) 

1
감사합니다. 저는 판다로 시작했습니다. 이것은 매우 도움이되었습니다. +1
nutship

4
함수의 행과 함께 다른 매개 변수를 전달하려면 어떻게해야합니까? 내가 할 경우, 행이 정의되지 말한다 ..
프라 샨스 manohar

3
당신은 사용해야 args의 매개 변수 .apply: 기능 pandas.pydata.org/pandas-docs/stable/generated/...
Zelazny7

1
저는 Python을 배우는 오래된 SAS 사용자이며 확실히 학습 곡선이 있습니다! :-) 예를 들어, 위의 코드는 SAS에서 다음 data df; set df; if A=B then C=0; else if A>B then C=1; else C=-1; run;과 같이 작성할 수 있습니다. 매우 우아하고 단순합니다.
RobertF

1
잘 정의 된 답
사힐 Nagpal

54
df.loc[df['A'] == df['B'], 'C'] = 0
df.loc[df['A'] > df['B'], 'C'] = 1
df.loc[df['A'] < df['B'], 'C'] = -1

인덱싱을 사용하여 쉽게 해결할 수 있습니다. 코드의 첫 번째 줄은 이렇게 읽습니다. 열 A이 열과 같으면 열 B을 만들고 C0으로 설정 합니다.


17

이 특정 관계의 경우 다음을 사용할 수 있습니다 np.sign.

>>> df["C"] = np.sign(df.A - df.B)
>>> df
   A  B  C
a  2  2  0
b  3  1  1
c  1  3 -1

6

여기에 이미지 설명 입력

위의 데이터 프레임이 원래 데이터 프레임이고 새 열 'old'를 추가하고 싶다고 가정 해 보겠습니다.

50 세 이상이면 older = yes로 간주하고 그렇지 않으면 False

1

row_indexes=df[df['age']>=50].index

단계 : 사용 기간이 50보다 큰 행의 인덱스를 가져옵니다. 2 단계 : .loc을 사용하여 열에 새 값을 할당 할 수 있습니다.

df.loc[row_indexes,'elderly']="yes"

50 세 미만인 경우 동일

row_indexes=df[df['age']<50].index

df[row_indexes,'elderly']="no"


1

여러 if 조건 numpy.select이있는 경우 갈 길은 다음과 같습니다.

In [4102]: import numpy as np
In [4098]: conditions = [df.A.eq(df.B), df.A.gt(df.B), df.A.lt(df.B)]
In [4096]: choices = [0, 1, -1]

In [4100]: df['C'] = np.select(conditions, choices)

In [4101]: df
Out[4101]: 
   A  B  C
a  2  2  0
b  3  1  1
c  1  3 -1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.