답변함

데이터분석 초보도 4주만에 합격하는 2026 이패스 AICE Associate(초록색 책 - 모의고사 4회 5번 문제)

모의고사 4회 5번 문제 질의

- 마력이 150이상이면서 연비가 50 초과하는 이상치를 제거하세요.

답지는 아래와 같습니다. 그러면 shape가 403개의 index 값이 나옵니다.

del_df.drop(del_df[(del_df['마력'] >= 150) & (del_df['연비'] > 50)].index, inplace=True)

 

그런데 여기서 이해가 안되는 부분이 생겼습니다.

만약 그런 논리라면 마력이 150 미만이면서 연비가 50 이하인 부분 값만 있으면 된다고 볼 수도 있습니다.

그럴 때, del_df = del_df[(del_df['마력'] < 150) & (del_df['연비'] <= 50)]
이것도 답이 될 수 있는데 이때는 shape가 329개의 index값이 나옵니다.

NaN값의 영향인지는 모르겠으나 이해가 되지 않습니다. 해당 부분이 왜 차이가 나는지 알려주세요

0

댓글

댓글 1개
날짜 투표수
  • 안녕하세요 질의주셔서 감사합니다.

    작성하신 코드는 다음과 같습니다.

    del_df = del_df[(del_df['마력'] < 150) & (del_df['연비'] <= 50)]

    이 코드는 마력이 150 미만이고 연비도 50 이하인 행만 남기겠다는 의미입니다. 그래서 원래는 삭제하면 안 되는 정상 데이터까지 같이 제외됩니다. 예를 들어 마력은 160이지만 연비가 40인 행이나, 마력은 120이지만 연비가 60인 행은 문제 조건상 이상치가 아니므로 남아야 하지만, 위 조건에서는 제거됩니다.

    그래서 답지 기준으로는 shape가 403개가 나오고, 작성하신 조건으로는 더 많은 행이 제거되어 329개가 나온 것입니다.

    따라서 답지와 동일한 결과를 필터링 방식으로 작성하려면 아래와 같이 전체 조건에 ~를 붙여야 합니다.

    del_df = del_df[~((del_df['마력'] >= 150) & (del_df['연비'] > 50))]


    또는 같은 의미로 아래처럼 작성할 수 있습니다.


    del_df = del_df[(del_df['마력'] < 150) | (del_df['연비'] <= 50)]


    즉, 제거 조건이 A & B라면 남기는 조건은 ~(A & B)이고, 이는 ~A | ~B와 같습니다.

    0

댓글을 남기려면 로그인하세요.

 

원하는 것을 찾지 못하셨나요?

질문하기