자격증공부/빅데이터분석기사 실기

[Pandas] idxmax() 결과 변환의 숨겨진 이유

악마토끼 2025. 6. 18. 14:03

데이터 분석을 하다 보면 가끔 이런 코드를 마주치게 됩니다:

 
python
dfmax = dfratio.idxmax(axis=1)
dfmax_reset = dfmax.reset_index().rename({0: '범죄유형'}, axis=1)

언뜻 보면 결과값이 똑같아 보이는데, 왜 굳이 아래 코드가 필요한 걸까요? 이 궁금증을 해결해보겠습니다.

두 코드의 실제 차이점

첫 번째 코드: Series 형태

dfmax = dfratio.idxmax(axis=1)
print(type(dfmax))  # <class 'pandas.core.series.Series'>
print(dfmax)

결과:

0    범죄유형3
1    범죄유형2  
2    범죄유형5
dtype: object

이는 Series 객체로, 인덱스는 원래 데이터의 행 번호(또는 연도 등)이고, 값은 해당 행에서 최댓값을 가진 열의 이름입니다.

두 번째 코드: DataFrame 형태

dfmax_reset = dfmax.reset_index().rename({0: '범죄유형'}, axis=1)
print(type(dfmax_reset))  # <class 'pandas.core.frame.DataFrame'>
print(dfmax_reset)

결과:

   index   범죄유형
0      0    범죄유형3
1      1    범죄유형2
2      2    범죄유형5

이는 DataFrame 객체로, 기존 인덱스가 'index' 열이 되고, 값들이 '범죄유형' 열이 됩니다.


왜 이런 변환이 필요할까?

1. 다른 데이터와의 병합 용이성

Series는 다른 DataFrame과 병합할 때 제약이 있습니다:

# Series로는 이런 작업이 복잡함
other_data = pd.DataFrame({'연도': [2020, 2021, 2022], '총합': [100, 150, 200]})

# DataFrame이면 쉽게 병합 가능
result = pd.concat([other_data, dfmax_reset], axis=1)

 

2. 명확한 컬럼명 지정

Series는 기본적으로 컬럼명이 없거나 숫자로 처리됩니다:

# Series: 컬럼명이 모호함
dfmax.to_csv('result.csv')  # 컬럼명이 '0'으로 저장됨

# DataFrame: 명확한 컬럼명
dfmax_reset.to_csv('result.csv')  # '범죄유형'으로 저장됨

 

3. 시각화와 분석의 편의성

많은 시각화 라이브러리나 분석 함수들이 DataFrame 형태를 선호합니다:

import seaborn as sns

# DataFrame이면 바로 시각화 가능
sns.countplot(data=dfmax_reset, x='범죄유형')

# Series는 추가 변환이 필요함
sns.countplot(x=dfmax.values)  # 축 레이블이 명확하지 않음

 

4. 후속 데이터 처리 작업

# DataFrame이면 다양한 그룹핑과 집계가 자유로움
crime_counts = dfmax_reset.groupby('범죄유형').size()

# 다른 열과의 조인도 간편함
final_result = dfmax_reset.merge(crime_details, on='범죄유형')
 

💛요약!

같은 데이터, 다른 활용도

  • Series: 단순한 조회나 인덱싱 작업에 적합
  • DataFrame: 복합적인 데이터 분석과 시각화에 적합

언제 변환해야 할까?

  1. 다른 데이터와 병합해야 할 때
  2. 명확한 컬럼명이 필요할 때
  3. 시각화나 리포팅을 해야 할 때
  4. 추가적인 그룹핑이나 집계가 필요할 때
반응형