본문 바로가기
Computer/python

[python] groupby 이중 사용시 컬럼의 모든 변수값 포함하는 법

by injeolmialmond 2021. 10. 28.

pandas의 groupby 함수는 데이터프레임의 특정 변수를 기준으로 묶은 데이터프레임을 반환해줍니다.

pandas.DataFrame.groupby — pandas 1.3.4 documentation (pydata.org)

 

pandas.DataFrame.groupby — pandas 1.3.4 documentation

Used to determine the groups for the groupby. If by is a function, it’s called on each value of the object’s index. If a dict or Series is passed, the Series or dict VALUES will be used to determine the groups (the Series’ values are first aligned; s

pandas.pydata.org


위의 데이터프레임에서 이름은 모든 값이 유니크하므로, groupby를 적용하더라도 동일한 모양의 데이터프레임이 반환됩니다. 하지만 나이, 학과의 경우 변수값이 겹치는 경우가 있습니다. groupby를 사용하기 적합합니다.

groupby는 이중, 삼중 이상으로도 사용할 수 있습니다. 이 경우에는 데이터프레임 이름이 df라면

df.groupby(['나이', '학과'])

와 같은 형태 (+뒤에 sum, mean 함수 등)로 사용할 수 있습니다. 우리의 데이터프레임에서 남은 변수는 '이름'인데, 이름의 경우 문자열이므로 mean을 적용할 수 없기 때문에 sum 함수를 사용해줍니다. 그 결과는 다음과 같습니다.

count 함수를 사용하면 다음과 같습니다.

그런데 만약 나이별로 통계/경영/지리/영문과 명 수를 모두 표기하고 싶다면? 20살 경영, 지리, 영문과가 0명인걸 표기하고 싶다면 어떻게 해야 할까요?!?!?!?

이런 식으로요!

정답은 unstack(), stack()에 있습니다!

pandas.DataFrame.unstack — pandas 1.3.4 documentation (pydata.org)

 

pandas.DataFrame.unstack — pandas 1.3.4 documentation

previous pandas.DataFrame.tz_localize

pandas.pydata.org

unstack은 groupby로 묶여있던 변수를 다시 컬럼으로 만들어줍니다. 이 과정에서 해당 컬럼 값이 없는 경우, 0으로 채워준다는 의미의 'fill_value=0' 인자를 입력해줍니다. 다시 stack()을 해주면 컬럼을 다시 묶어줍니다.

정리하면 다음과 같습니다.

df.groupby(['나이', '학과']).count().unstack(fill_value=0).stack()

이렇게 하면 위의 테이블과 같은 모양의 데이터프레임을 만들 수 있습니다!

 

 

참고

python - Pandas groupby for zero values - Stack Overflow

 

Pandas groupby for zero values

I have data like this in a csv file Symbol Action Year AAPL Buy 2001 AAPL Buy 2001 BAC Sell 2002 BAC Sell 2002 I am able to read it and groupby like this df.groupby(['

stackoverflow.com

 

댓글