2017-09-15 5 views
2

저는 에너지 이름이 & 인 데이터 프레임을 가지고 있습니다. 국가의 에너지 출력이 에너지 출력의 중앙값보다 높거나 낮은 지 여부에 따라 1 또는 0을 할당하는 새 열을 추가해야합니다. 일부 더미 코드는 다음과 같습니다팬더 DataFrame - 다른 열을 기준으로 1,0 값을 할당합니다.

import pandas as pd 
def answer(): 
    df = pd.DataFrame({'name':['china', 'america', 'canada'], 'output': [33.2, 15.0, 5.0]}) 
    df['newcol'] = df.where(df['output'] > df['output'].median(), 1, 0) 
    return df['newcol'] 
answer() 

코드는 ValueError를 반환 : 2 통과 항목 수가 잘못은, 배치 나는이 기분 1

은 매우 간단 수정하지만 내가 팬더 작업에 새로 온 사람을 의미한다. 내 좌절감을 끝내십시오.

답변

1

@Vaishali는 pd.DataFrame.where이 예상대로 작동하지 않고 대신 np.where을 사용하는 것이 좋은 이유를 설명합니다. 이는 매우 좋은 조언입니다.

나는 부울 결과를 단순히 정수로 변환 할 수 있다고 제안하겠다.

설정

df = pd.DataFrame({ 
    'name':['china', 'america', 'canada'], 
    'output': [33.2, 15.0, 5.0] 
}) 

옵션 1

df['newcol'] = (df['output'] > df['output'].median()).astype(int) 

옵션 2
또는 빠른 아직 기본 NumPy와 배열

01를 사용하여
o = df['output'].values 
df['newcol'] = (o > np.median(o)).astype(int) 
+0

)를 인쇄하면 무슨 일이 있었는지 알 수 있습니다. :) – Vaishali

+0

많이 고마워요! 부울 마스킹을 시도했지만 반환 된 True | False 값을 다시 포맷하는 데 어려움을 겪고있었습니다. 나는 판다 스에게 아주 새로운데, 나는 모든 문서를 배우는 데 어려움을 겪고있다. 너와 @Vaishali 매우 유익한되었습니다 :) –

2

솔루션이 벡터화 될 때 루프가 필요하지 않습니다.

df['newcol'] = np.where((df['output'] > df['output'].median()), 1, 0) 

    name output newcol 
0 china 33.2 1 
1 america 15.0 0 
2 canada 5.0  0 

잘못된 항목 수가 전달되면 df.where는 np.where와 약간 다릅니다. self와 동일한 도형의 객체를 반환합니다.이 객체의 해당 엔트리는 self에서 나온 것이며 cond는 True이고 그렇지 않으면 other의 객체입니다. 따라서 시리즈 대신 두 개의 열이있는 케이스에서 데이터 프레임을 반환하므로 해당 데이터 프레임을 시리즈에 할당하려고하면 오류 메시지가 나타납니다.

+0

다른 게시물이 np.where를 사용하는 이유가 궁금합니다! 그래서 본질적으로 내가하고 있던 일은 새로운 시리즈에 df 전체를 전달하는 것이었고 그것이 오류를 던진 이유입니다. –

+0

np.where는 if-else와 같은 종류의 시나리오에서 출력이 boolean이 아닌 다른 데이터 형식이어야 할 때 매우 유용합니다. 부울의 경우에도 작동하지만 부울 마스킹이 더 효과적입니다. 그리고 네, 여러분은 df를 새로운 시리즈로 전달 했으므로 오류가 발생했습니다. df.where (df [ 'output']> df [ 'output'] . – Vaishali