해결된 질문
작성
·
25
0
캐글 t1-38.pivot-py 질문이 있습니다.
# - 1) 총가입금액 컬럼을 생성하세요. (총가입금액 = 보험상품_가입금액 + 저축상품_가입금액)
df['총가입금액'] = df['보험상품_가입금액'] + df['저축상품_가입금액']
# print(df.head())
# - 2) 각 지점코드와 연령대별로, 성별에 따른 총가입금액 합계를 구하세요.(단 합계 결측치일 때는 0으로 대체하시오)
df_pv = df.pivot_table(index=['지점코드', '연령대'], columns='성별', values='총가입금액', aggfunc='sum', fill_value=0).reset_index()
# print(df_pv) # C303 50대 2 컬럼 => NaN
# # # help(pd.pivot_table) # fill_value 여기서 확인 가능
# - 3) 연령대가 40대 또는 50대인 경우에 한해, 성별 간 총가입금액 차이(절댓값 기준)가 가장 큰 지점코드를 구하세요. (정답은 지점코드 1개 예: B204)
# print(df.head())
cond40 = df['연령대'] == '40대'
cond50 = df['연령대'] == '50대'
df = df[cond40 | cond50]
# print(df.head())
df_pv2 = df.pivot_table(index=['지점코드', '연령대'], columns='성별', values='총가입금액', aggfunc = 'sum', fill_value=0).reset_index()
# print(df_pv2)
df_pv2['diff'] = abs(df_pv2[1] - df_pv2[2])
# print(df_pv2['diff'].idxmax())
cond = df_pv2['diff'].idxmax()
# print(df_pv2.loc[cond]['지점코드'])
# C303
# - 4) 3번에서 찾은 지점과 연령대에서, 총가입금액이 더 높은 성별의 금액은 전체 고객 총가입금액의 몇 %를 차지하나요? (반올림 후 소수 셋째자리 구하기)
# print(df_pv2)
# print(df_pv2.loc[cond]['연령대']) # 50대
# print(df.head())
total = df['총가입금액'].sum()
# print(total) # 150333657
# print(df_pv2)
cond_a = df_pv2['지점코드'] == 'C303'
cond_b = df_pv2['연령대'] == '50대'
df3 = df_pv2[cond_a & cond_b]
# print(df3) # 12353774
diff = 12353774
result = diff / total * 100
print(round(result, 3))
제가 작성한 코드입니다.
강사님께서 풀이로 올려주신 코드와 약간의 차이가 있지만,
결국 차이(diff)값과 total값은 똑같을텐데
저는 결과값이 8.218이 출력되고있습니다.
잘못 코딩한 부분 지적해주시면 감사하겠습니다!
매번 감사드립니다.
내일 모레 시험 잘 보고 오겠습니다.
답변 2
0
응원합니다! 💪 시험 얼마 안 남았네요.
df = df[cond40 | cond50] => df가 필터링 된 상태가 되어버려
전체 고객 총가입금액을 df로 구할 수가 없게 되었어요
0
안녕하세요, 인프런 AI 인턴입니다.
뚜뚜님께서 질문해주신 부분을 정리하자면, 연령대와 지점코드에 맞는 총가입금액 데이터를 그룹화하여 분석하고 그 중 특정 성별의 총가입금액이 전체 가입금액의 몇 퍼센트인지 계산하는 과정에서의 문제점이 있는 듯합니다.
뚜뚜님의 코드에서 주의 깊게 봐야 할 부분은 다음과 같습니다:
조건부 인덱싱 및 그룹화: df_pv2['diff'] = abs(df_pv2[1] - df_pv2[2])
에서 성별을 나타내는 부분에 인덱스 번호 대신 컬럼명을 사용합니다. 이는 데이터프레임에서 컬럼명이 인덱스 번호로 변환된 상태를 방지하고 명확한 가독성을 보장합니다.
절댓값 활용: 성별간의 총가입금액 차이를 절댓값으로 계산한 부분이 잘못 연산되는지 확인이 필요합니다. 이 경우 abs()
의 적용 위치나 범위가 잘못 선택되었을 가능성이 있습니다.
총가입금액 비율 계산: result = diff / total * 100
에서 차이가 있는지 분석해봐야 하며, 특히 diff
값을 제대로 추출하고 있는지 검토해보세요.
데이터프레임의 Column 네이밍 문제: df_pv2
데이터프레임 생성 시 pivot_table의 결과에 따라 생성된 컬럼명이 의도와 다를 수 있습니다. 이는 아래 코드에서 인덱싱 시 문제를 발생할 수 있습니다.
강사님의 기존 답변과 해설을 참조하면 더 정확한 접근을 확인할 수 있을 듯 합니다. 다음의 답변들에서 같은 문제를 다루고 있으니 확인해 보세요:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.