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
그런 다음 열을 만들고 설정합니다.C
0과 같은
이 특별한 관계를 위해, 당신은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
위의 데이터 프레임이 원래 데이터 프레임이고 새 열 '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
'programing' 카테고리의 다른 글
R과 함께 Win7 64비트에서 rJava 패키지 사용 (0) | 2023.06.20 |
---|---|
벡터에 지정된 요소가 포함되어 있는지 여부 테스트 (0) | 2023.06.20 |
Python에서 dict.clear()와 {} 할당 간의 차이 (0) | 2023.06.15 |
가피 가져오기.auth2 in angular 2 type 스크립트 (0) | 2023.06.15 |
컴파일 오류:'ASP.global_asax' 유형이 두 DLL에 모두 있습니다. (0) | 2023.06.15 |