Pandas 활용한 데이터 분석 입문(6) - 집계함수, 그룹화, 합치기

천호영·2021년 6월 22일
0

Pandas의 집계함수

Pandas 에서도 다양한 집계함수를 제공하고 있습니다.

집계함수는 각 함수들의 사용법을 이해하는 것보다 데이터의 집계 방향을 이해하고 분석하고자 하는 데이터에 맞게 활용하는 것이 더 중요합니다.

DataFrame에 저장되어 있으면? Pandas의 집계함수
NDArray에 저장되어 있으면? NumPy의 집계함수

  • Pandas 의 데이터 집계 방향
    - 기본적으로 axis=0 의 방향으로 데이터를 집계하도록 구현되어 있습니다.(numpy에서는 axis=None이 기본값)
    - axis=1 인자를 통해서 집계의 방향으로 바꿀 수 있습니다.
  • 기본적으로 결측 값은 집계 대상에서 제외되므로, 결측 값이 포함될 필요가 있는 경우는 skipna=False 인자를 추가로 지정해야 합니다.

<실습코드>

import pandas as pd
import numpy as np

# 실습 데이터 생성
score = {'sub1': [3, 9, 1, 1, 9],
         'sub2': [2, 9, np.nan, np.nan, 8],
         'sub3': [np.nan, 1, 5, 5, 7],
         'sub4': [np.nan, 3, np.nan, 1, np.nan]}

df = pd.DataFrame(data=score)
print(df)


'''
count() 집계함수 실습
'''
print('\n#1 Count Function')
print(df.count())


'''
count 함수에 axis=1 인자 추가한 실습
'''
print('\n#2 Count Function with axis=1')
print(df.count(axis=1))


'''
sum() 집계함수 실습
'''
print('\n#3 Sum Function')
print(df.sum())


'''
sum() 함수에 skipna=False 인자 추가한 실습
'''
print('\n#4 Sum Function with skipna')
print(df.sum(skipna=False))

<실행결과>

   sub1  sub2  sub3  sub4
0     3   2.0   NaN   NaN
1     9   9.0   1.0   3.0
2     1   NaN   5.0   NaN
3     1   NaN   5.0   1.0
4     9   8.0   7.0   NaN

#1 Count Function
sub1    5
sub2    3
sub3    4
sub4    2
dtype: int64

#2 Count Function with axis=1
0    2
1    4
2    2
3    3
4    3
dtype: int64

#3 Sum Function
sub1    23.0
sub2    19.0
sub3    18.0
sub4     4.0
dtype: float64

#4 Sum Function with skipna
sub1    23.0
sub2     NaN
sub3     NaN
sub4     NaN
dtype: float64

데이터의 그룹화

데이터 그룹화 과정은
원본 데이터를 특정 그룹별로 나누어(split),
의미있는 연산을 적용한 뒤(apply),
그룹별 연산 최종 결과를(combine) 확인하는
일련의 프로세스를 가집니다.

다양한 상황과 조건에 따라 groupby 함수를 활용하는 법이 있습니다.

  • df.groupby('product')
  • df.groupby('product').sum()
  • df.groupby(['product', 'sensor']).sum()
  • df.groupby(['product', 'sensor'])['x'].sum()
  • df.groupby(['product', 'sensor']).agg({'x':'max', 'y':'min'})

<실습코드>

import pandas as pd
import numpy as np

# 실습 데이터 생성
sample = {'product':['a','b','a','b','a','b','a','a'],
          'sensor':['s1','s1','s2','s3','s2','s2','s1','s3'],
          'x':np.arange(1,9),
          'y':np.arange(5,13)}

df = pd.DataFrame(data=sample)
print(df)


'''
product 컬럼 기준으로 그룹화하기
'''
print('\n#1 groupby-product')
grouped_product = df.groupby('product')
print(grouped_product)


'''
grouped_product 에 저장된 key와 value 출력하기
'''
print('\n#2 key & value')
for key, value in grouped_product:
      print("-----------------------")
      print("key :", key)
      print("value :\n", value)


'''
groupby 결과에 집계함수 적용하기
'''
print('\n#3 groupby-product')
grouped_product = df.groupby('product').sum()
print(grouped_product)


'''
product, sensor 기준으로 그룹화하기
'''
print('\n#4 groupby-product,sensor')
grouped_product = df.groupby(['product','sensor'])
print(grouped_product)


'''
그룹화한 뒤 x 컬럼에 대해서만 집계함수 적용하기
'''
print('\n#5 groupby-product,sensor')
grouped_product = df.groupby(['product','sensor'])['x'].sum()
print(grouped_product)


'''
그룹화한 뒤 컬럼별 다른 집계함수 적용하기
'''
print('\n#6 groupby-product,sensor')
condition = {'x':'max', 'y':'min'}
grouped_product = df.groupby(['product','sensor']).agg(condition)
print(grouped_product)

<실행결과>

  product sensor  x   y
0       a     s1  1   5
1       b     s1  2   6
2       a     s2  3   7
3       b     s3  4   8
4       a     s2  5   9
5       b     s2  6  10
6       a     s1  7  11
7       a     s3  8  12

#1 groupby-product
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x7f0779353b80>

#2 key & value
-----------------------
key : a
value :
   product sensor  x   y
0       a     s1  1   5
2       a     s2  3   7
4       a     s2  5   9
6       a     s1  7  11
7       a     s3  8  12
-----------------------
key : b
value :
   product sensor  x   y
1       b     s1  2   6
3       b     s3  4   8
5       b     s2  6  10

#3 groupby-product
          x   y
product        
a        24  44
b        12  24

#4 groupby-product,sensor
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x7f078bd7e4c0>

#5 groupby-product,sensor
product  sensor
a        s1        8
         s2        8
         s3        8
b        s1        2
         s2        6
         s3        4
Name: x, dtype: int64

#6 groupby-product,sensor
                x   y
product sensor       
a       s1      7   5
        s2      5   7
        s3      8  12
b       s1      2   6
        s2      6  10
        s3      4   8

데이터 합치기

pd.concat(objs, axis, join)
  • 2개 이상의 Series, DataFrame 객체를 결합하는 함수
  • 기본적으로 axis=0 의 방향으로 데이터를 결합함
  • 채울 값이 없는 경우는 NaN 으로 저장됨
  • 기본적으로 합집합 데이터셋을 기준으로 결합함(join='outer')
  • Parameters
    objs : 결합할 객체들의 종류와 순서를 리스트로 지정
    ignore_index=True : 기존 인덱스는 무시하고 0 부터 n-1 까지의 인덱스로 초기화함
    axis=1 : 행의 방향으로 데이터를 결합시킴
    join = ‘inner’ : 인덱스를 기준으로 교집합 데이터를 결합시킴

<실습코드>

import pandas as pd

# 실습 데이터 생성
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
                    'B': ['B0', 'B1', 'B2', 'B3'],
                    'C': ['C0', 'C1', 'C2', 'C3'],
                    'D': ['D0', 'D1', 'D2', 'D3']},
                    index=[0, 1, 2, 3])

df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
                    'B': ['B4', 'B5', 'B6', 'B7'],
                    'C': ['C4', 'C5', 'C6', 'C7'],
                    'D': ['D4', 'D5', 'D6', 'D7']},
                    index=[4, 5, 6, 7])                   

df3 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'],
                    'B': ['B8', 'B9', 'B10', 'B11'],
                    'C': ['C8', 'C9', 'C10', 'C11'],
                    'D': ['D8', 'D9', 'D10', 'D11']},
                    index=[8, 9, 10, 11])

df4 = pd.DataFrame({'B': ['B2', 'B3', 'B6', 'B7'],
                    'D': ['D2', 'D3', 'D6', 'D7'],
                    'F': ['F2', 'F3', 'F6', 'F7']},
                    index=[2, 3, 6, 7])
                    
print('DF1')
print(df1)
print('\nDF2')
print(df2)
print('\nDF3')
print(df3)
print('\nDF4')
print(df4)


'''
df2, df1 합치기
'''
print('\n#1 Concat df2, df1')
result = pd.concat([df2,df1, df3], ignore_index=True)
print(result)


'''
shape 이 서로 다른 df1, df4 합치기
'''
print('\n#2 Concat df1, df4')
result = pd.concat([df1,df4])
print(result)


'''
슬라이싱을 통해 일부 데이터 합치기
'''
print('\n#3 Concat df1, df4 by slicing')
result = pd.concat([df1[:2],df4[3:]])
print(result)

 
'''
행 기준으로 df1, df4 합치기
'''
print('\n#4 Concat df1, df4 by axis=1')
result = pd.concat([df1,df4], axis=1, ignore_index=True)
print(result)

 
'''
교집합으로 데이터 결합하기
'''
print('\n#5 Concat df1, df4 by join=inner')
result = pd.concat([df1,df4], join='inner')
print(result)

<실행결과>

DF1
    A   B   C   D
0  A0  B0  C0  D0
1  A1  B1  C1  D1
2  A2  B2  C2  D2
3  A3  B3  C3  D3

DF2
    A   B   C   D
4  A4  B4  C4  D4
5  A5  B5  C5  D5
6  A6  B6  C6  D6
7  A7  B7  C7  D7

DF3
      A    B    C    D
8    A8   B8   C8   D8
9    A9   B9   C9   D9
10  A10  B10  C10  D10
11  A11  B11  C11  D11

DF4
    B   D   F
2  B2  D2  F2
3  B3  D3  F3
6  B6  D6  F6
7  B7  D7  F7

#1 Concat df2, df1
      A    B    C    D
0    A4   B4   C4   D4
1    A5   B5   C5   D5
2    A6   B6   C6   D6
3    A7   B7   C7   D7
4    A0   B0   C0   D0
5    A1   B1   C1   D1
6    A2   B2   C2   D2
7    A3   B3   C3   D3
8    A8   B8   C8   D8
9    A9   B9   C9   D9
10  A10  B10  C10  D10
11  A11  B11  C11  D11

#2 Concat df1, df4
     A   B    C   D    F
0   A0  B0   C0  D0  NaN
1   A1  B1   C1  D1  NaN
2   A2  B2   C2  D2  NaN
3   A3  B3   C3  D3  NaN
2  NaN  B2  NaN  D2   F2
3  NaN  B3  NaN  D3   F3
6  NaN  B6  NaN  D6   F6
7  NaN  B7  NaN  D7   F7

#3 Concat df1, df4 by slicing
     A   B    C   D    F
0   A0  B0   C0  D0  NaN
1   A1  B1   C1  D1  NaN
7  NaN  B7  NaN  D7   F7

#4 Concat df1, df4 by axis=1
     0    1    2    3    4    5    6
0   A0   B0   C0   D0  NaN  NaN  NaN
1   A1   B1   C1   D1  NaN  NaN  NaN
2   A2   B2   C2   D2   B2   D2   F2
3   A3   B3   C3   D3   B3   D3   F3
6  NaN  NaN  NaN  NaN   B6   D6   F6
7  NaN  NaN  NaN  NaN   B7   D7   F7

#5 Concat df1, df4 by join=inner
    B   D
0  B0  D0
1  B1  D1
2  B2  D2
3  B3  D3
2  B2  D2
3  B3  D3
6  B6  D6
7  B7  D7

0개의 댓글