2017-03-03 3 views
3

'side'의 해당 값이 'B'인 행 'nominal'의 행의 음수 값을 변환하려고합니다. 나는 변환되지 않은 행을 잃고 싶지 않습니다. 나는 아래이 시도했지만 KeyError('%s not in index' % objarr[mask])Pandas Dataframe의 다른 열의 내용을 기반으로 한 열에서 연산 실행

df[-df['nominal']].where(df['side']=='B') 
+0

당신이 샘플 dataframe를 게시 할 수 있을까요? 그것은 그것없이 당신의 예를 통해 걷는 것이 어렵습니다. 또한 "음수 값 변환 시도"에 대해 언급 할 때 변환 대상은 무엇입니까? 그들에게''B ''를 만들려고하십니까? – MattR

답변

1

당신이 시도해야합니다

df.loc[ (df.side == 'B'), 'nominal' ] *= -1 
+0

아래에 이미 제시 한 답변과 동일하다는 점을 감안할 때 무엇을 묻는 메시지가 표시됩니까? – miradulo

2

그냥 &와 부울 인덱스에 두 조건을 사용하여 인상하기.

df[(df.side == 'B') & (df.nominal < 0)] 

또는 수정에 대한하려는 경우,

df.loc[(df.side == 'B') & (df.nominal < 0), 'nominal'] 

>>> df = pd.DataFrame(dict(side=['A']*3+['B']*3, nominal = [1, -2, -2, 2, 6, -5])) 
>>> df 
    nominal side 
0  1 A 
1  -2 A 
2  -2 A 
3  2 B 
4  6 B 
5  -5 B 

>>> df.loc[(df.side == 'B') & (df.nominal < 0), 'nominal'] = 1000 

>>> df 
    nominal side 
0  1 A 
1  -2 A 
2  -2 A 
3  2 B 
4  6 B 
5  1000 B 

이것은 자주 건너 것이다 팬더의 필터링 데이터에 대한 매우 표준적인 방법이다. 팬더 문서의 Boolean Indexing을 참조하십시오. 업데이트 된 문제에 대한 설명


업데이트

, 우리는 -1로 우리의 원하는 값을 곱 증강 할당 연산자 *=를 사용할 수 있습니다.

df.loc[(df.side == 'B'), 'nominal'] *= -1 

>>> df = pd.DataFrame(dict(nominal = [1, 2, 5, 3, 5, 3], side=['A']*3 + ['B']*3)) 

>>> df 
    nominal side 
0  1 A 
1  2 A 
2  5 A 
3  3 B 
4  5 B 
5  3 B 

>>> df.loc[(df.side == 'B'), 'nominal'] *= -1 

df 
    nominal side 
0  1 A 
1  2 A 
2  5 A 
3  -3 B 
4  -5 B 
5  -3 B 
+0

내 문제는 좀 더 까다 롭습니다. 'nominal'열의 모든 값은 양수입니다. 해당 열 측면 = "B" – obabs

+0

@ obabs 경우에만 음수 값으로 변환 할 싶습니다 내 대답 업데이트. 원래 질문에서 더 명확한 것이 도움이되었을 것입니다. – miradulo

관련 문제