Pandas 전처리 연습(6)

SeongGyun Hong·2024년 11월 12일

빅데이터 분석기사

목록 보기
5/16

1. value_counts()와 정렬 정리

Series 구조

value_counts() 실행 시 생성되는 Series 구조:

  • 인덱스: host_name과 같은 고유값
  • : 빈도수

정렬 방식 차이점

sort_index() 정렬

df.host_name.value_counts().sort_index()
  • 인덱스(host_name) 기준 알파벳순 정렬
  • 특수문자 → 숫자 → 알파벳 순 배치

sort_values() 정렬

df.host_name.value_counts().sort_values()
  • 빈도수 기준 오름차순 정렬
  • 적은 수 → 큰 수 순 배치

정렬 결과

# 초기 상태
host2    150
host1    120
(abc     100

# sort_index() 결과
(abc     100  # 특수문자 우선
host1    120  # 알파벳 순
host2    150

# sort_values() 결과
(abc     100  # 빈도수 기준
host1    120
host2    150

2. groupby와 size 함수 이해

동작 원리

Ans = df.groupby('host_name').size()
  • groupby: host_name 기준으로 데이터 그룹화
  • size(): 각 그룹의 행 개수 계산
  • value_counts()와 동일한 결과값 출력

value_counts()와 차이점

groupby().size()

# 그룹화 후 각 그룹의 크기 계산
df.groupby('host_name').size()
host1    120
host2    150

value_counts()

# 각 값의 빈도 직접 계산
df['host_name'].value_counts()
host2    150
host1    120

특징

  • groupby: 다중 컬럼 그룹화 가능
  • size: 결측값(NaN) 포함 계산
  • value_counts: 결측값 제외 계산
  • 메모리 사용량: groupby가 더 효율적

3. value_counts를 활용한 데이터프레임 변환

코드 구현

# 빈도수 계산 및 데이터프레임 변환
frequency = df['host_name'].value_counts().reset_index()
frequency.columns = ['host_name', 'counts']
frequency = frequency.sort_values(by='counts', ascending=False)

처리 과정

  1. value_counts(): host_name 빈도수 계산
  2. reset_index(): Series를 데이터프레임으로 변환
  3. columns 이름 변경: ['host_name', 'counts']로 지정
  4. sort_values(): counts 기준 내림차순 정렬

결과

  host_name  counts
0     host1       3
1     host2       3
2     host3       1
3     (abc)       1

특징

  • reset_index(): 인덱스를 새로운 컬럼으로 변환
  • sort_values(): 지정 컬럼 기준 정렬
  • ascending=False: 내림차순 설정

4. groupby size()와 reset_index() 차이

출력 형태 비교

groupby().size()

target = df.groupby('host_name').size()

# Series 형태로 출력
host_name
(abc)    1
host1    3
host2    2
host3    1
dtype: int64

groupby().size().reset_index()

target = df.groupby('host_name').size().reset_index()

# DataFrame 형태로 출력
  host_name  0
0     (abc)  1
1     host1  3
2     host2  2
3     host3  1

주요 차이점

  • reset_index() 미사용: Series 객체 반환
  • reset_index() 사용: DataFrame 객체 반환
  • DataFrame 변환 시 인덱스가 새로운 열로 추가
  • DataFrame은 열 이름 변경 및 데이터 처리가 더 용이

5. groupby의 as_index 파라미터 설명

as_index=True (기본값)

# 그룹화된 열이 인덱스로 지정됨
                     size
n_group  n_hood
강남구    역삼동         150
         삼성동         120
강북구    수유동         100

as_index=False

# 그룹화된 열이 일반 컬럼으로 유지됨
n_group  n_hood  size
강남구    역삼동    150
         삼성동    120
강북구    수유동    100

주요 특징

  • True: 그룹화 기준 열이 인덱스로 변환
  • False: 그룹화 기준 열이 일반 컬럼으로 유지
  • False 사용 시 SQL 스타일의 결과 출력
  • 다중 컬럼 그룹화 시 False가 데이터 처리에 더 용이

활용 시 장점

  • 후속 데이터 처리가 더 편리
  • 열 이름 변경이 자유로움
  • 일반 DataFrame 형태 유지로 작업 용이

7. groupby와 agg 함수의 차이점 설명

방법 1: groupby().max()

result = df.groupby('neighbourhood_group')['neighbourhood'].max()
  • 단순히 neighbourhood 컬럼의 최댓값만 추출
  • Series 형태로 결과 반환
  • 결과가 더 간단하고 직관적

방법 2: groupby().agg()

result = df.groupby('neighbourhood_group').agg({'neighbourhood': 'max'})
  • agg 함수를 통해 더 복잡한 집계 연산 가능
  • DataFrame 형태로 결과 반환
  • 여러 컬럼에 대해 다양한 집계 함수 적용 가능

결과 비교

# 방법 1 결과 (Series)
neighbourhood_group
강남구    압구정동
강북구    화곡동
Name: neighbourhood, dtype: object

# 방법 2 결과 (DataFrame)
                neighbourhood
neighbourhood_group
강남구            압구정동
강북구            화곡동

agg 함수의 장점

  • 여러 컬럼에 대해 서로 다른 집계 함수 적용 가능
  • 예: agg({'neighbourhood': 'max', 'price': 'mean'})
  • DataFrame 형태로 반환되어 후속 처리가 용이

8. 그룹별 값 개수 계산

코드 구현

# 방법 1: groupby와 count 사용
result = df.groupby('neighbourhood_group')['neighbourhood'].count()

# 방법 2: value_counts 사용
result = df['neighbourhood_group'].value_counts()

# 방법 3: groupby와 size 사용
result = df.groupby('neighbourhood_group').size()

결과 예시

neighbourhood_group
강남구    150
강북구    120
강서구    100
Name: neighbourhood, dtype: int64

방법별 특징

  • count(): NULL 값 제외하고 계산
  • value_counts(): 빈도수 계산, 기본적으로 내림차순 정렬
  • size(): NULL 값 포함하여 계산
  • 모든 방법이 Series 형태로 결과 반환

9. 그룹별 room_type 비율의 간단한 계산 방법

방법 1: crosstab 사용

# normalize='index'로 행 기준 비율 계산
result = pd.crosstab(df['neighbourhood_group'], 
                     df['room_type'], 
                     normalize='index') * 100

방법 2: value_counts 사용

# groupby 후 normalize=True로 비율 계산
result = df.groupby('neighbourhood_group')['room_type'].value_counts(normalize=True) * 100
result = result.unstack()

결과 예시

                    Entire home/apt  Private room  Shared room
neighbourhood_group
강남구                    70.5           25.3          4.2
강북구                    45.2           50.6          4.2

특징

  • crosstab: 더 직관적이고 간단한 코드
  • value_counts: groupby와 함께 사용하기 편리
  • normalize 파라미터로 자동 비율 계산
  • 두 방법 모두 동일한 결과 출력
profile
헤매는 만큼 자기 땅이다.

0개의 댓글