조건부 교체 판다
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
'code' 카테고리의 다른 글
ASP의 이름을 바꿉니다.NET_세션이드 (0) | 2023.07.07 |
---|---|
-u 플래그는 it push -u origin 마스터를 의미합니까? (0) | 2023.07.07 |
VS 2017 Git 로컬 커밋 모든 커밋에 대한 DB.lock 오류 (0) | 2023.07.07 |
목록 인덱스가 있으면 X를 수행합니다. (0) | 2023.07.07 |
파일을 복사하는 포스트 tsc 빌드 작업을 추가하는 방법은 무엇입니까? (0) | 2023.07.07 |