Python Library - Pandas(8)

에이블·2022년 2월 14일
0

파이썬

목록 보기
20/20

본 게시물은 코드프레소의 code.PRESS-UP 체험단 과정을 담은 게시물입니다.

해당 게시물 수강강좌 :

파이썬으로 배우는 데이터 분석 : Pandas

Pandas 라이브러리로 데이터 분석 시작하기

https://www.codepresso.kr/course/56

이번 포스팅에서는 Pandas에서 활용되는 집계함수에 대해 알아보겠습니다.

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

집계함수는 각 함수들의 사용업을 이해하는것도 중요하지만
데이터의 집계 방향을 이해하고 분석하고자 하는 데이터에 맞게 활용하는것이 더 중요하겠습니다.

DataFrame에 저장 -> pandas의 집계함수
Ndarray에 저장 -> NumPy의 집계함수

1. 집계함수

📌 축 정보(axis)를 기준으로 데이터에 집계 함수 연산 적용
📌 Pandas의 집계함수는 기본적으로 axis = 0 으로 동작함
📌 axis = 1 인자를 통해서 집계의 방향으로 바꿀 수 있습니다.

<예제>

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

2. 그룹화

데이터 그룹화 과정은
원본 데이터를 특정 그룹별로 나누어(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

3. 합치기

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

길고 길었던 Pandas Library 정리가 끝났습니다.
Pandas의 모든것을 알 수는 없습니다. Pandas 자체가 매우 방대하고 강력한 Library이다보니 모든것을 파악하고 습득할 수는 없습니다만

기초적인 내용을 알고 API와 공식문서를 참조하는것과 그냥 참조하는것은 매우 다릅니다.

코드프레소 강의를 통해 기초적인 내용을 파악할 수 있어서 매우 좋았습니다.

다음 포스팅에서는 본격적으로 NumPy와 Pandas를 이용하여 통계데이터를 분석하는
약간 실무적인 내용을 다루겠습니다.

코드프레소 강의와 함께 통계 데이터를 분석하여 봅시다.

profile
꺾이지 않는 마음

0개의 댓글