[pandas] 열 통계, 집단 분석

파이썬 라이브러리 pandas로 열 통계, groupby, pivot을 활용하는 방법에 대해 정리했다.

특정 열에 대한 통계치

df.column_name.command()와 같은 식으로 열 이름 뒤에 단순한 command만 적어줘도 통계 값을 쉽게 산출할 수 있다. 사용할 수 있는 command로 아래와 같은 것들이 있다.

  • mean
  • std
  • median
  • max
  • min
  • count
  • nunique
  • unique

nunique는 고유값의 개수, unique는 고유값 리스트를 돌려준다.


집단 분석 (groupby)

집단 분석은 기본적으로 groupby를 활용한다. 이렇게.

df.groupby('column1').column2.measurement()

예를 들어 이런 데이터 프레임에서

student 별로 grade의 평균을 정리하고 싶다면 이렇게 하면 된다.

grades = df.groupby('student').grade.mean()

결과는 아래와 같이 나온다.

groupby를 사용하면 기존 데이터 프레임으로부터 새로운 series를 생성하는 것이다. 즉, 그냥 groupby를 사용했을 때의 결과물은 데이터 프레임이 아니다.

그러나 이때 reset_index()를 사용해서 인덱스를 리셋하면 type이 데이터프레임으로 바꿔줄 수 있다. 이런식으로 쓰면 된다.

df.groupby('column1').column2.measurement().reset_index()

좀 더 복잡한 계산을 하려면 groupby에서 열 이름 뒤에 apply()를 활용해서 함수나 lambda를 넣어주면 된다.

예를 들어 이런 df가 있을 때

category별로 wage의 백분위 75에 해당하는 값을 구하고 싶다면

high_earners = df.groupby('category').wage.apply(lambda x: \
        np.percentile(x, 75)).reset_index()

groupby를 사용할 땐 뒤에 reset_index()를 습관적으로 붙여주면 좋다.


groupby를 두 개 이상의 기준으로 보고 싶으면 인자로 열 이름 리스트를 넣어주면 된다.

예를 들어 이런 df가 있을 때

‘Location’, ‘Day of Week’ 이라는 두 개의 열을 기준으로 보고 싶으면 이렇게 하면 된다.

df.groupby(['Location', 'Day of Week'])['Total Sales'].mean().reset_index()

결과는 아래와 같이 나온다.

피벗 테이블 (pivot)

groupby를 활용해서 정리한 아래와 같은 결과는 보기 좀 불편하다.

그럴 땐 이렇게 바꿔보면 편하다.

이게 바로 흔히 말하는 피벗 테이블이다.

Pandas에서 피벗 테이블을 생성하는 방법은 다음과 같다.

df.pivot(columns='ColumnToPivot', index='ColumnToBeRows', values='ColumnToBeValues')

위 예제에서 실제로 적용하려면 이런 코드가 나올 거다.

unpivoted = df.groupby(['Location', 'Day of Week'])['Total Sales'].mean().reset_index()

pivoted = unpivoted.pivot(columns='Day of Week', index='Location', values='Total Sales')

pivot을 사용할 때도 맨 뒤에 reset_index()를 붙여주면 데이터 프레임이 된다. 습관처럼 쓰자.

추천 글


댓글 남기기