programing

if-elif-elif-else 조건을 기반으로 새 열 생성

mailnote 2023. 6. 20. 21:45
반응형

if-elif-elif-else 조건을 기반으로 새 열 생성

데이터 프레임이 있습니다.df:

    A    B
a   2    2 
b   3    1
c   1    3

다음 기준에 따라 새 열을 생성하려고 합니다.

if 행A == B: 0

if 행A > B: 1

if 행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)판다는 한 단계로 문제를 해결하기 위한 특별한 구문을 제공합니까? (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

여러 개인 경우if다음과 같은 조건을 충족해야 합니다.

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

enter image description here

위의 데이터 프레임이 원래 데이터 프레임이고 새 열 'old'를 추가하려고 합니다.

연령이 50세 이상이면 오래된 것으로 간주됩니다.= 그렇지 않으면 거짓입니다.

1단계: 사용 기간이 50보다 큰 행의 인덱스를 가져옵니다.

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

2단계: .loc을 사용하여 열에 새 값을 할당할 수 있습니다.

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

50세 미만도 마찬가지입니다.

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

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

방법을 사용할 수 있습니다.mask:

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

와의 단일 해결책.list comprehension그리고.zip()또한

df.loc[:,'C']= [0 if d1==d2 else 1 if d1>d2 else -1 for d1,d2 in zip(df.A,df.B)]

원하는 출력을 반환합니다.

언급URL : https://stackoverflow.com/questions/21702342/creating-a-new-column-based-on-if-elif-else-condition

반응형