Python : 03. Grouping

yeppi1802·2024년 6월 22일

03. Grouping 실습

❇️ 요약

  • 그룹화하여 특정 값을 추출
  • 통계적 지표 확인

배운 것설명
groupby(column)컬럼으로 그룹화
size()null 포함 카운트
counts()null 포함하지 않고 카운트
sort_index()인덱스를 기준으로 레이블을 정렬하는 메서드
value_counts()컬럼이 가지고 있는 유일 값 추출, 갯수 많은 순서대로 내림차순
value_counts(dropna=False)null 값 포함하여 나타내기
\엔터 표시(함수 여러줄일때 사용)
to_frame()데이터프레임으로 변경
rename({레이블명 : 값})레이블의 이름을 변경하는 메서드
groupby()데이터를 그룹화하여 연산을 수행
groupby([’col1’, ‘col2’])여러개 지정시 순차적으로 groupby
agg()여러개의 함수를 동시에 적용, 여러 사칙연산 할 경우 대괄호로 묶어줌
as_index = False그룹화할 내용을 인덱스로 할지 여부 / True면 시리즈로, False면 데이터프레임형태로 출력
unstack()행을 언피벗하여 하위 열로 변환하는 메서드 / 열을 피벗하여 하위 행으로 변환하는 stack과 반대 개념
fillna(값)DataFrame에서 결측값을 원하는 값으로 변경하는 메서드
[:,:]모든 값
valuesDataFrame 요소를 Numpy 형태(numpy.ndarray)로 반환, 레이블은 삭제
reshape(변경할 배열, 차원)배열과 차원을 변형해주는 함수

📖 자세히

[함수 참고 - [Python 완전정복 시리즈] 2편 : Pandas DataFrame 완전정복]

🔆 sort_index

  • 기본형태
df.sort_index(axis=0, level=None, ascending=True, inplace=False, kind='quicksort', 
              na_position='last', sort_remaining=True, ignore_index=False, key=None)

axis : {0 : index / 1: columns} 정렬할 레이블입니다. 0이면 행, 1이면 열을 기준으로 정렬

level : multi index의 경우 정렬을 진행할 level

ascending : 오름차순으로할지 여부, 기본은 True로 오름차순

inplace : 원본을 대체할지 여부, True일 경우 원본을 대체

na_position : {first / last} Na값의 위치, 기본값은 last로 정렬시 맨 뒤에 위치

sort_remaining : multi index의 경우 다른 레벨에 대해서도 정렬을할지 여부,  True로 할 경우

한 레벨에 대한 정렬이 완료되면, 다른 레벨도 정렬

ignore_index : 인덱스의 무시 여부,  True일 경우 인덱스의 순서와 상관없이 0,1,2,... 로 정해집니다.

🔆 rename()

  • 기본형태
df.rename(mapper=None, index=None, columns=None, axis=None, copy=True, 
          inplace=False, level=None, errors='ignore')

mapper : 변경할 {레이블명 : 값}, dict나 함수형태가 올 수 있는데, 축이 지정되어있지 않으므로 axis인수와 함께 사용해야 함

axis : mapper의 변경값이 적용될 축

indexcolumns : 변경할 {레이블명 : 값}, 미리 축을 지정하기 때문에 axis인수와 병행사용할 수 없다.

copy : 사본을 생성할지 여부

inplace : Pandas 공통 인수인 inplace는 원본을 수정할지의 여부를 지정

level : Multi Index의 경우 레벨을 지정

errors : {'ignore' / 'raise'} mapperindexcolumns에서 지정한 dict에 해당하는 key값이 없을경우, 오류를 발생시킬지 여부

🔆 groupby

  • 기본형태
df.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, 
           squeeze=NoDefault.no_default, observed=False, dropna=True)

by : 그룹화할 내용. 함수, 축, 리스트 등등이 올 수 있다.

axis : 그룹화를 적용할 축

level : 멀티 인덱스의 경우 레벨을 지정 가능

as_index : 그룹화할 내용을 인덱스로 할지 여부, False이면 기존 인덱스가 유지

sort : 그룹키를 정렬할지 여부

group_keys : apply메서드 사용시 결과에 따라 그룹화 대상인 열이 인덱스와 중복(group key)이 될 수 있음. 이 때, group_keys=False로 인덱스를 기본값으로 지정 가능

squeeze : 결과가 1행 or 1열짜리 데이터일 경우 Series로, 1행&1열 짜리 데이터일 경우 스칼라로 출력

observed : Categorical로 그룹화 할 경우 Categorical 그룹퍼에 의해 관찰된 값만 표시할 지 여부

dropna : 결측값을 계산에서 제외할지 여

level인수의 사용 (Multi Index)

Multi Index의 경우 level을 숫자나 str 형태로 지정해주어 groupby를 실행 가능

먼저 Multi Index 객체를 생성

idx = [['idx1','idx1','idx2','idx2','idx2'],['row1','row2','row1','row2','row3']]
col = ['col1','col2','col2']
data = np.random.randint(0,9,(5,3))
df = pd.DataFrame(data=data, index = idx, columns = col).rename_axis(index=['lv0','lv1'])
print(df)
>>
           col1  col2  col2
lv0  lv1
idx1 row1     7     3     7
     row2     2     1     6
idx2 row1     1     7     2
     row2     3     5     7
     row3     5     1     8

level을 int로 지정해주는 경우

print(df.groupby(level=1).sum())
>>
      col1  col2  col2
lv1
row1     8    10     9
row2     5     6    13
row3     5     1     8

level을 str로 지정해주는경우 + (여러개 지정시 순차적으로 groupby)

Copyprint(df.groupby(['lv1','lv0']).sum())
>>
           col1  col2  col2
lv1  lv0
row1 idx1     7     3     7
     idx2     1     7     2
row2 idx1     2     1     6
     idx2     3     5     7
row3 idx2     5     1     8

🔆 agg()

  • 기본형태
df.agg(func=None, axis=0, args, kwargs)

func : 함수

axis :{0 : index(row) / 1 : columns} 축, 0은 행, 1은 열, arg : 함수의 인수

kwargs : dict 형태의 함수의 인수

입력되는 함수의 형태에 따라

np.함수 형태나 그냥 문자열 형태로 입력 가능

lambda함수사용자 정의 함수도 사용 가능

여러 함수를 동시에 적용하는 경우

listdict 형태로 func 값 입력하는 경우 여러 함수 동시에 적용 가능

# list
ex = df.agg(['min','max','sum','prod'])

# dict
ex = df.agg({2:'sum',0:'max',1:'min'})

🔆 unstack()

  • 기본형태
df.unstack(level=- 1, fill_value=None)

level : MultiIndex의 경우 하위열로 변환할 행의 레벨 / 기본값은 -1로 최하위 레벨이 선

fill_value : 생성된 열의 값에 결측치가 있을 경우 대체할 값

🔆 fillna

  • 기본형태
df.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None)

value : 결측값을 대체할 값 / dict형태로도 가능

method : 결측값을 변경할 방식 /  bfill로 할 경우 결측값을 바로 아래 값과 동일하게 변경 / ffill로 할 경우 결측값을 바로 위 값과 동일하게 변경

axis : {0 : index / 1 : columns} fillna 메서드를 적용할 레이블

inplace : 원본을 변경할지 여부/ True일 경우 원본을 변경

limit : 결측값을 변경할 횟수/ 위에서부터 limit로 지정된 갯수만큼만 변경

downcast : 다운캐스트할지 여부/ downcast='infer'일 경우 float64를 int64로 변경

🔆 reshape()

  • 기본형태
np.reshape(변경할 배열, 차원)

배열.reshape(차원)
  • reshape에서 -1의 의미
:  변경된 배열의 ‘-1’ 위치의 차원은
   “원래 배열의 길이와 남은 차원으로 부터 추정”이 된다는 뜻
x = np.arange(12)
x = x.reshape(3,4)
x
>>> array([[ 0,  1,  2,  3],
       	   [ 4,  5,  6,  7],
       	   [ 8,  9, 10, 11]])
  • reshape(-1,정수) : 행의 위치에 -1인 경우
x.reshape(-1,1)
>>> array([[ 0],
       	   [ 1],
       	   [ 2],
           [ 3],
           [ 4],
           [ 5],
           [ 6],
           [ 7],
           [ 8],
           [ 9],
           [10],
           [11]])
x.reshape(-1,2)
>>> array([[ 0,  1],
           [ 2,  3],
           [ 4,  5],
           [ 6,  7],
           [ 8,  9],
           [10, 11]])
x.reshape(-1,3)
>>> array([[ 0,  1,  2],
           [ 3,  4,  5],
           [ 6,  7,  8],
           [ 9, 10, 11]])

즉, 행(row)의 위치에 -1을 넣고 열의 값을 지정해주면 변환될 배열의 행의 수는 알아서 지정이 된다는 뜻

  • reshape(정수,-1) : 열의 위치에 -1인 경우
x.reshape(1,-1)
>>> array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]])
x.reshape(2,-1)
>>> array([[ 0,  1,  2,  3,  4,  5],
           [ 6,  7,  8,  9, 10, 11]])
x.reshape(3,-1)
>>> array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11]])

행(row)의 수를 지정해주면 열은 알아서 자동으로 재배열을 해주는 것

0개의 댓글