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에서 결측값을 원하는 값으로 변경하는 메서드 |
[:,:] | 모든 값 |
values | DataFrame 요소를 Numpy 형태(numpy.ndarray)로 반환, 레이블은 삭제 |
reshape(변경할 배열, 차원) | 배열과 차원을 변형해주는 함수 |
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,... 로 정해집니다.
df.rename(mapper=None, index=None, columns=None, axis=None, copy=True,
inplace=False, level=None, errors='ignore')
mapper : 변경할 {레이블명 : 값}, dict나 함수형태가 올 수 있는데, 축이 지정되어있지 않으므로 axis인수와 함께 사용해야 함
axis : mapper의 변경값이 적용될 축
index, columns : 변경할 {레이블명 : 값}, 미리 축을 지정하기 때문에 axis인수와 병행사용할 수 없다.
copy : 사본을 생성할지 여부
inplace : Pandas 공통 인수인 inplace는 원본을 수정할지의 여부를 지정
level : Multi Index의 경우 레벨을 지정
errors : {'ignore' / 'raise'} mapper, index, columns에서 지정한 dict에 해당하는 key값이 없을경우, 오류를 발생시킬지 여부
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
df.agg(func=None, axis=0, args, kwargs)
func : 함수
axis :{0 : index(row) / 1 : columns} 축, 0은 행, 1은 열, arg : 함수의 인수
kwargs : dict 형태의 함수의 인수
입력되는 함수의 형태에 따라
np.함수 형태나 그냥 문자열 형태로 입력 가능
lambda함수 나 사용자 정의 함수도 사용 가능
여러 함수를 동시에 적용하는 경우
list나 dict 형태로 func 값 입력하는 경우 여러 함수 동시에 적용 가능
# list
ex = df.agg(['min','max','sum','prod'])
# dict
ex = df.agg({2:'sum',0:'max',1:'min'})
df.unstack(level=- 1, fill_value=None)
level : MultiIndex의 경우 하위열로 변환할 행의 레벨 / 기본값은 -1로 최하위 레벨이 선
fill_value : 생성된 열의 값에 결측치가 있을 경우 대체할 값
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로 변경
np.reshape(변경할 배열, 차원)
배열.reshape(차원)
: 변경된 배열의 ‘-1’ 위치의 차원은
“원래 배열의 길이와 남은 차원으로 부터 추정”이 된다는 뜻
x = np.arange(12)
x = x.reshape(3,4)
x
>>> array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
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을 넣고 열의 값을 지정해주면 변환될 배열의 행의 수는 알아서 지정이 된다는 뜻
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)의 수를 지정해주면 열은 알아서 자동으로 재배열을 해주는 것