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

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 개의 새 열을 만든 다음 결과를 결합 할 필요가 없음)?



답변

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

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

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))


답변

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으로 설정 합니다.


답변

이 특정 관계의 경우 다음을 사용할 수 있습니다 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


답변

여기에 이미지 설명 입력

위의 데이터 프레임이 원래 데이터 프레임이고 새 열 ‘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"


답변

여러 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


답변