Pandas/DataFrame/pivot_table()/apply()/cut()/qcut()

김홍찬·2023년 1월 22일
0

학습내용

  • pivot_table 메소드
  • apply 메소드
  • cut()/qcut() 메소드

pivot_table()

DataFrame.pivot_table(values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All')

  • 엑셀의 pivot_table 같은 기능을 제공해준다.
  • 분류별 집계를 처리하는 함수로 그룹으로 묶고자 하는 컬럼들을 행과 열로 위치시키고 집계값을 보여준다.
  • 2개 이상의 컬럼을 가지고 groupby 할 때 pivot_table을 사용하면 가독성이 더 좋다.

매개변수

  • index

    • 문자열 또는 리스트. index로 올 컬럼들
  • columns

    • 문자열 또는 리스트. column으로 올 컬럼들
  • values

    • 문자열 또는 리스트. 집계할 대상 컬럼들
  • aggfunc

    • 집계함수 지정. 함수, 함수이름문자열, 함수리스트(함수이름 문자열/함수객체), dict: 집계할 함수
    • 기본값: 평균을 구한다.
  • fill_value, dropna

    • fill_value: 집계시 NA가 나올경우 채울 값
    • dropna: boolean. 컬럼의 전체값이 NA인 경우 그 컬럼 제거(기본값: True)
  • margins/margins_name

    • margin: boolean(기본값: False). 총집계결과를 만들지 여부.
    • margin_name: margin의 이름 문자열로 지정 (생략시 All)

apply()

  • Series, DataFrame의 데이터 일괄 처리
  • DataFrame의 행들과 열들 또는 Series의 원소들에 공통된 처리를 할 때 apply 함수를 이용하면 반복문을 사용하지 않고 일괄 처리가 가능하다.

DataFrame.apply(함수, axis=0, args=(), \*\*kwarg)
인수로 행이나 열을 받는 함수를 apply 메서드의 인수로 넣으면 데이터프레임의 행이나 열들을 하나씩 함수에 전달한다.

매개변수

  • 함수: DataFrame의 행들 또는 열들을 전달할 함수
  • axis: 0-컬럼(열)을 전달, 1-행을 전달 (기본값 0)
  • args: 함수에 행/열 이외에 전달할 매개변수를 위치기반(순서대로) 튜플로 전달
  • **kwarg: 함수에 행/열 이외에 전달할 매개변수를 키워드 인자로 전달

Series.apply(함수, args=(), \*\*kwarg)
인수로 Series의 원소들을 받는 함수를 apply 메소드의 인수로 넣으면 Series의 원소들을 하나씩 함수로 전달한다.

매개변수

  • 함수: Series의 원소들을 전달할 함수
  • args: 함수에 원소 이외에 전달할 매개변수를 위치기반(순서대로) 튜플로 전달
  • **kwarg: 함수에 원소 이외에 전달할 매개변수를 키워드 인자로 전달

cut()/qcut()

연속형(실수)을 범주형으로 변환시킨다.

pd.cut(x, bins,right=True, labels=None)

매개변수

  • x

    • 범주형으로 바꿀 대상. 1차원 배열형태의 자료구조
  • bins

    • 범주로 나눌때의 기준값들을 리스트로 묶어서 전달
  • right

    • 구간경계의 기준을 결정
    • True : 오른쪽을 포함(기본값)
    • False :왼쪽을 포함
    • (): 불포함
    • []: 포함
  • labels

    • 각 범주의 label을 리스트로 전달
    • 생략시 범위를 범주명으로 사용한다.
np.random.seed(0)

# 1~99 사이의 난수 15개
age = np.random.randint(1,100,size=15) 

# 평균: 170, 표준편차: 10 인 정규분포를 따르는 난수 15개.
# 170-10*2 ~ 170+10*2 범위. 평균에 가까운 값들이 많이 생성.
tall = np.round(np.random.normal(170,10,size=15),2) 

# 사전을 사용 dataframe 생성
df=pd.DataFrame({
    "나이":age,
    "키":tall
})
df

   나이    키
0	45	183.65
1	48	169.02
2	65	145.74
3	68	165.47
4	68	165.29
5	10	179.73
6	84	157.22
7	22	184.37
8	37	169.22
9	88	180.90
10	71	170.97
11	89	184.19
12	89	181.68
13	13	179.47
14	59	180.85
# cut 사용

나이대 = pd.cut(df['나이'], bins=3,
				right=False,
                labels=['나이대1','나이대2','나이대3'])

나이대
0     나이대2
1     나이대2
2     나이대3
3     나이대3
4     나이대3
5     나이대1
6     나이대3
7     나이대1
8     나이대2
9     나이대3
10    나이대3
11    나이대3
12    나이대3
13    나이대1
14    나이대2
Name: 나이, dtype: category
Categories (3, object): ['나이대1' < '나이대2' < '나이대3']
----------------------------------------------------
# '나이대'로 구한 범주값을 갖는 나이대1 컬럼 추가

df['나이대1'] = 나이대

df
	나이	키	나이대1
0	45	183.65	나이대2
1	48	169.02	나이대2
2	65	145.74	나이대3
3	68	165.47	나이대3
4	68	165.29	나이대3
5	10	179.73	나이대1
6	84	157.22	나이대3
7	22	184.37	나이대1
8	37	169.22	나이대2
9	88	180.90	나이대3
10	71	170.97	나이대3
11	89	184.19	나이대3
12	89	181.68	나이대3
13	13	179.47	나이대1
14	59	180.85	나이대2

----------------------------------------------------
# bins 값 설정하기

# 나누는 기준점. (0~20], (20~40], (40~60], (60~90]
l = [0,20,40,60,90]
나이대2 = pd.cut(df['나이'], bins=l,
				labels=['청소년','청년','장년','노년']
                
0      장년
1      장년
2      노년
3      노년
4      노년
5     청소년
6      노년
7      청년
8      청년
9      노년
10     노년
11     노년
12     노년
13    청소년
14     장년
Name: 나이, dtype: category
Categories (4, object): ['청소년' < '청년' < '장년' < '노년']
----------------------------------------------------
df['나이대2']=나이대2
df

	나이	키	나이대1	나이대2
0	45	183.65	나이대2	장년
1	48	169.02	나이대2	장년
2	65	145.74	나이대3	노년
3	68	165.47	나이대3	노년
4	68	165.29	나이대3	노년
5	10	179.73	나이대1	청소년
6	84	157.22	나이대3	노년
7	22	184.37	나이대1	청년
8	37	169.22	나이대2	청년
9	88	180.90	나이대3	노년
10	71	170.97	나이대3	노년
11	89	184.19	나이대3	노년
12	89	181.68	나이대3	노년
13	13	179.47	나이대1	청소년
14	59	180.85	나이대2	장년

pd.qcut(x, q, labels)

대상배열의 최대값~ 최소값을 지정한 개수의 동등한 size가 되도록 나눈다.

매개변수

  • x
    • 나눌 대상. 1차원 배열형태의 자료구조
  • q
    • 나눌 개수
  • labels
    • 각 구간(범주)의 label을 리스트로 전달
키대 = pd.qcut(df['키'], q=3, 
			  'labels=['작은키','중간키','큰키'])

키대

0      큰키
1     작은키
2     작은키
3     작은키
4     작은키
5     중간키
6     작은키
7      큰키
8     중간키
9      큰키
10    중간키
11     큰키
12     큰키
13    중간키
14    중간키
Name: 키, dtype: category
Categories (3, object): ['작은키' < '중간키' < '큰키']
--------------------------------------------------
# 3등분 된 것을 확인 할 수 있다.

키대.value_counts()
작은키    5
중간키    5
큰키     5
Name: 키, dtype: int6
--------------------------------------------
df['키대'] = 키대
df

	나이	키	나이대1	나이대2	키대
0	45	183.65	나이대2	장년	큰키
1	48	169.02	나이대2	장년	작은키
2	65	145.74	나이대3	노년	작은키
3	68	165.47	나이대3	노년	작은키
4	68	165.29	나이대3	노년	작은키
5	10	179.73	나이대1	청소년	중간키
6	84	157.22	나이대3	노년	작은키
7	22	184.37	나이대1	청년	큰키
8	37	169.22	나이대2	청년	중간키
9	88	180.90	나이대3	노년	큰키
10	71	170.97	나이대3	노년	중간키
11	89	184.19	나이대3	노년	큰키
12	89	181.68	나이대3	노년	큰키
13	13	179.47	나이대1	청소년	중간키
14	59	180.85	나이대2	장년	중간키
profile
바쁘다 바빠

0개의 댓글