2014-03-26 5 views
0

팬더 데이터 프레임에서 새 열을 초기화 한 다음 수정하는 코드가 왜 비정상적으로 작동하는지 이해하려고합니다. 다음과 같이 내 코드는 다음과 같습니다빈 팬더 데이터 프레임을 만들고 수정하면 예기치 않은 동작이 발생합니다

pos = df['sign'] == 'Pos' 
neg = df['sign'] == 'Neg' 
df['signed_val'] = 0 
df['signed_val'][pos] = df['abs_val'][pos] 
df['signed_val'][neg] = -df['abs_val'][neg] 
df['pos_part'] = (df['abs_val']+df['signed_val'])/2 

, df이 포함 된 기존 DataFrame입니다 표시된 열 'abs_val'과 '기호'. 내 목표는 'abs_val'의 서명 된 버전을 포함하는 추가 행 'signed_val'로 새 열을 만드는 것입니다.

이 코드를 실행할 때 두 가지 중 하나가 발생합니다. 먼저 파이썬 인터프리터에 전체 코드 블록을 복사하여 붙여 넣으면 df['signed_val']이 모두 0으로 채워집니다. 또는 한 번에 한 줄을 복사하여 내 파이썬 인터프리터에 붙여 넣으면 df['signed_val']df['abs_val']의 서명 된 버전을 제공하는 것으로 보입니다.

분명히이 동작은 허용되지 않습니다. 내가 여기서 뭔가 잘못하고있는 건가, 아니면이게 버그 야?

업데이트는 :

pos = df['sign'] == 'Pos' 
neg = df['sign'] == 'Neg' 
df['signed_val'] = 0 
df['signed_val'][pos] = df['abs_val'][pos] 
df['signed_val'][neg] = -df['abs_val'][neg] 
df['signed_val'] 

즉시 다른 명령이 실행되는 한, 그러나 df['signed_val'] 인쇄 :

다음 코드는 마지막 줄 df['abs_val']의 서명 된 버전을 출력으로 예상 실행 나타납니다 밖으로 0의 벡터.

여전히
pos = df['sign'] == 'Pos' 
neg = df['sign'] == 'Neg' 
df['signed_val'] = numpy.nan 
df['signed_val'][pos] = df['abs_val'][pos] 
df['signed_val'][neg] = -df['abs_val'][neg] 
df['pos_part'] = (df['abs_val']+df['signed_val'])/2 

은, 무슨 일이 첫 번째 코드 블록과 무슨 일이 일어나고 : 나는 광범위하게 그것을 테스트하지 않은 있지만, 다음 코드 세 번째 블록은 예상대로 실행할 수 있습니다?

팬더 버전 0.13.1 및 numpy 버전 1.8.0을 사용하고 있습니다.

답변

3

당신이 체인 할당을하고 여기를 참조 :이 지속적으로 작동 하나의 dtyped 프레임 http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

을; 일반적으로 멀티 dtyped 프레임에서는 그렇지 않습니다.

대신 안정적으로 값을 설정하려면 인덱서 loc/ix을 사용하십시오.

+0

제 1 코드 블록과 제 2 코드 블록의 차이점을 볼 수 없다는 점이 궁금합니다. 왜 다르게 행동합니까? 내가 놓친 게 있니? – zhangxaochen

+0

무슨 뜻인지 확실하지 않습니까? – Jeff

+0

df [ 'signed_val'] [pos] = df [ 'abs_val'] [pos]'는 첫 번째 코드 블록에서도 작동해야합니다. 왜냐하면'df [ 'signed_val']'은 복사본이 아니라 참조를하기 때문입니다 . 왜 OP가 작동하지 않는다고 말하는가? 첫 번째 코드 블록과 두 번째 코드 블록 (코드 블록 1의 마지막 행을 제외하고)간에 차이점은 없습니다. – zhangxaochen

관련 문제