팬더 데이터 프레임에서 새 열을 초기화 한 다음 수정하는 코드가 왜 비정상적으로 작동하는지 이해하려고합니다. 다음과 같이 내 코드는 다음과 같습니다빈 팬더 데이터 프레임을 만들고 수정하면 예기치 않은 동작이 발생합니다
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을 사용하고 있습니다.
제 1 코드 블록과 제 2 코드 블록의 차이점을 볼 수 없다는 점이 궁금합니다. 왜 다르게 행동합니까? 내가 놓친 게 있니? – zhangxaochen
무슨 뜻인지 확실하지 않습니까? – Jeff
df [ 'signed_val'] [pos] = df [ 'abs_val'] [pos]'는 첫 번째 코드 블록에서도 작동해야합니다. 왜냐하면'df [ 'signed_val']'은 복사본이 아니라 참조를하기 때문입니다 . 왜 OP가 작동하지 않는다고 말하는가? 첫 번째 코드 블록과 두 번째 코드 블록 (코드 블록 1의 마지막 행을 제외하고)간에 차이점은 없습니다. – zhangxaochen