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
을 만들고 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
답변
위의 데이터 프레임이 원래 데이터 프레임이고 새 열 ‘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