code

조건부 교체 판다

starcafe 2023. 7. 7. 19:16
반응형

조건부 교체 판다

DataFrame이 있는데 값이 0을 초과하는 특정 열의 값을 바꾸고 싶습니다.저는 이것이 이를 달성하는 방법이라고 생각했습니다.

df[df.my_channel > 20000].my_channel = 0

채널을 새 데이터 프레임에 복사하면 다음과 같이 간단합니다.

df2 = df.my_channel 

df2[df2 > 20000] = 0

이것은 제가 원하는 것을 정확히 수행하지만 원래 데이터 프레임의 일부로 채널과 함께 작동하지 않는 것 같습니다.

.ix인덱서는 0.20.0 이전 버전의 판다에 대해서는 정상적으로 작동하지만, 판다 0.20.0 이후로.ix인덱서는 더 이상 사용되지 않으므로 사용하지 마십시오.대신 다음을 사용할 수 있습니다..loc또는iloc색인 작성자다음을 통해 이 문제를 해결할 수 있습니다.

mask = df.my_channel > 20000
column_name = 'my_channel'
df.loc[mask, column_name] = 0

아니면, 한 줄로

df.loc[df.my_channel > 20000, 'my_channel'] = 0

mask의 행을 선택하는 데 도움이 됩니다.df.my_channel > 20000이라True,하는 동안에df.loc[mask, column_name] = 0값 0을 선택한 행으로 설정합니다.mask이름이 있는 열에 저장됩니다.column_name.

업데이트: 이 경우 다음을 사용해야 합니다.loc왜냐하면 만약 당신이 사용한다면iloc당신은 a를 받을 것입니다.NotImplementedError정수 유형에 대한 iLocation 기반 부울 인덱싱을 사용할 수 없음을 알려줍니다.

해라

df.loc[df.my_channel > 20000, 'my_channel'] = 0

참고: v0.20.0 이후,ix 위해 더 이상 사용되지 않습니다.loc/iloc.

np.where 기능은 다음과 같이 작동합니다.

df['X'] = np.where(df['Y']>=50, 'yes', 'no')

당신의 경우, 당신은 다음을 원할 것입니다.

import numpy as np
df['my_channel'] = np.where(df.my_channel > 20000, 0, df.my_channel)

원본 데이터 프레임이 업데이트되지 않는 이유는 연결된 인덱싱으로 인해 데이터 프레임의 보기가 아닌 복사본을 수정할 수 있기 때문입니다.의사들은 다음과 같은 조언을 합니다.

판다 개체에서 값을 설정할 때는 체인 인덱싱이라고 하는 것을 방지하도록 주의해야 합니다.

몇 가지 대안이 있습니다.

loc 부울 인덱스

loc값을 설정하는 데 사용할 수 있으며 부울 마스크를 지원합니다.

df.loc[df['my_channel'] > 20000, 'my_channel'] = 0

mask 부울 인덱스

시리즈에 할당할 수 있습니다.

df['my_channel'] = df['my_channel'].mask(df['my_channel'] > 20000, 0)

또는 영상 시리즈를 업데이트할 수 있습니다.

df['my_channel'].mask(df['my_channel'] > 20000, 0, inplace=True)

np.where 부울 인덱스

조건이 충족되지 않을 때 원래 영상 시리즈를 할당하여 NumPy를 사용할 수 있지만, 처음 두 솔루션은 명시적으로 지정된 값만 변경하므로 더 깨끗합니다.

df['my_channel'] = np.where(df['my_channel'] > 20000, 0, df['my_channel'])

사용해 보십시오.

df.my_channel = df.my_channel.where(df.my_channel <= 20000, other= 0)

또는

df.my_channel = df.my_channel.mask(df.my_channel > 20000, other= 0)

나는 사용할 것입니다.lambda에 대한 기능Series상당한DataFrame다음과 같이:

f = lambda x: 0 if x>100 else 1
df['my_column'] = df['my_column'].map(f)

저는 이것이 효율적인 방법이라고 주장하지는 않지만, 잘 작동합니다.

데이터 프레임 값을 목록과 비교하여 동일한 작업을 수행하려고 합니다.

df.loc[df['value'] in [1,2,3], 'another_column'] = 'yes'

지금까지 저는 오류를 이해합니다.

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

하지만 하나라도 시도하면([1,2,3]) 다음 오류가 발생합니다.

TypeError: argument of type 'bool' is not iterable

언급URL : https://stackoverflow.com/questions/21608228/conditional-replace-pandas

반응형