본문 바로가기

코딩/파이썬과 데이터 사이언스

파이썬과 데이터 사이언스 : pandas 라이브러리

 

pandas는 데이터 분석과 조작을 위한 파이썬 라이브러리로 1차원 자료 구조인 Series와 2차원 자료 구조인 DataFrame 등을 제공합니다.

 

Series 동일 타입의 데이터를 저장하는 1차원 배열과 같은 자료 구조
DataFrame 동일 또는 서로 다른 타입의 데이터가 열(column)로 구성되는 2차원 배열과 같은 자료 구조
NaN Not a number의 의미로 값이 존재하지 않음을 나타냄

Series

Series 자료 구조는 Series 클래스를 통해 생성합니다.

 

import pandas as pd

d = [10, 20, 30]
sr = pd.Series(d)

print(sr)

 

 

아래는 Series 클래스 __init__ 메서드에 대한 매개변수 정의입니다.

 

pandas.Series(data=None,
              index=None,
              dtype: Dtype | None = None,
              name=None,
              copy: bool = False,
              fastpath: bool = False)

 

sr.index Series의 Index 정보를 반환 또는 설정
= sr.keys() -> Index 반환
sr.values Series의 각 구성 요소의 데이터 값을 반환
sr.dtype Series의 각 구성 요소의 데이터 타입 정보를 반환
sr.name Series 객체의 이름을 반환 또는 설정
sr.index.name Series의 index 이름을 반환 또는 설정

 

아래는 생성한 Series 객체의 index를 변경하는 코드입니다.

 

import pandas as pd

d = [10, 20, 30]
sr = pd.Series(d)

print(sr)
print(sr.index)
sr.index = ['a', 'b', 'c']
print(sr.index)
sr.index = [1, 2, 3]
print(sr.index)

 

 

아래는 원하는 행의 데이터 값을 확인하거나 바꾸는 코드입니다.

 

import pandas as pd

d = [10, 20, 30, 40, 50]
sr = pd.Series(d, index=['a', 'b', 'c', 'd', 'e'])

print(sr['d'])
print((sr[['d']]))
print(sr[['a', 'e', 'c']])
print(sr['b':'c'])
print(sr[1:2])
sr[::2] = 100
print(sr)

 

DataFrame

DataFrame 자료 구조는 DataFrame 클래스를 통해 생성합니다.

 

import pandas as pd

cpi = {
    '총지수': [101.04, 101.58, 101.84, 101.98, 102.05],
    '식료품 및 비주류음료': [103.39, 105.69, 105.84, 105.35, 105.16],
    '주류 및 담배': [100.16, 100.21, 99.87, 100.38, 100.43],
    '의류 및 신발': [100.19, 100.24, 100.25, 100.2, 100.36]
}

df = pd.DataFrame(cpi, index=['2021/01', '2021/02', '2021/03', '2021/04', '2021/05'])

print(df)

 

 

아래는 DataFrame 클래스 __init__ 메서드에 대한 매개변수 정의입니다.

 

pandas.DataFrame(data=None,
                 index: Axes | None = None,
                 columns: Axes | None = None,
                 dtype: Dtype | None = None,
                 copy: bool | None = None)

 

df[y]
df[[y1, y2, ...]]
df[[boolean, ...]
y 이름의 column 데이터에 접근
문법적으로는 df.y 방식의 사용도 가능
df[y][x] y 이름의 column과 x 이름의 row 데이터에 접근
df.loc[x]
df.loc[xm:xn]
df.loc[[x1, x2, ...]]
df.loc[[boolean, ...]]
x 이름의 row 데이터에 접근
df.loc[x][y]
df.loc[x, y]
df.loc[[x], [y]]
x 이름의 row와 y 이름의 column 데이터에 접근
응용으로 df.loc[x1:xm, y1:yn] 방식의 사용도 가능
df.iloc[x]
df.iloc[xm:xn]
df.iloc[[x1, x2, ...]]
df.iloc[[boolean, ...]]
x 번째 row 데이터에 접근하며 x는 0부터 시작
df.iloc[x][y] x 번째 row와 y 이름의 column 데이터에 접근
df[xm:xn] row를 기준으로 xm부터 xn-1 사이 데이터에 접근

 

DataFrame의 데이터 접근 시 데이터에 대한 조건을 추가할 수 있습니다.

 

import pandas as pd

cpi = {
    '총지수': [101.04, 101.58, 101.84, 101.98, 102.05],
    '식료품 및 비주류음료': [103.39, 105.69, 105.84, 105.35, 105.16],
    '주류 및 담배': [100.16, 100.21, 99.87, 100.38, 100.43],
    '의류 및 신발': [100.19, 100.24, 100.25, 100.2, 100.36]
}

df = pd.DataFrame(cpi, index=['2021/01', '2021/02', '2021/03', '2021/04', '2021/05'])

cond1 = df['총지수'] >= 101.8
cond2 = df['총지수'] <= 102.0

print(df.loc[cond1 & cond2])

 

 

● apply() 메서드

 

DataFrame의 apply() 메서드를 이용하면 DataFrame 내 각 요소에 대한 접근 및 조작을 반복문을 사용하지 않고도 한번에 수행하는 것이 가능합니다.

 

import pandas as pd

cpi = {
    '총지수': [101.04, 101.58, 101.84, 101.98, 102.05],
    '식료품 및 비주류음료': [103.39, 105.69, 105.84, 105.35, 105.16],
    '주류 및 담배': [100.16, 100.21, 99.87, 100.38, 100.43],
    '의류 및 신발': [100.19, 100.24, 100.25, 100.2, 100.36]
}

df = pd.DataFrame(cpi, index=['2021/01', '2021/02', '2021/03', '2021/04', '2021/05'])

print(df.apply(lambda x: x - 100))
print()
print(df['총지수'].apply(lambda x: x - 100))

 

 

import pandas as pd

cpi = {
    '총지수': [101.04, 101.58, 101.84, 101.98, 102.05],
    '식료품 및 비주류음료': [103.39, 105.69, 105.84, 105.35, 105.16],
    '주류 및 담배': [100.16, 100.21, 99.87, 100.38, 100.43],
    '의류 및 신발': [100.19, 100.24, 100.25, 100.2, 100.36]
}

df = pd.DataFrame(cpi, index=['2021/01', '2021/02', '2021/03', '2021/04', '2021/05'])

print(df, end='\n\n')


def calculate_average(els):
    s = 0
    for e in els:
        s += (e - 100)
    return s / len(els)


print(df.apply(calculate_average), end='\n\n')
print(df.apply(calculate_average, axis=1))

 

 

● concat() 함수

 

pandas의 concat() 함수는 둘 이상의 DataFrame을 합칠 때 사용할 수 있습니다.

 

import pandas as pd
import numpy as np

df1 = pd.DataFrame(np.random.randint(1, 5, (5, 3)), columns=range(1, 4))
print(df1)
print()

df2 = pd.DataFrame(np.random.randint(10, 50, (5, 2)), columns=range(3, 5))
print(df2)
print()

print(pd.concat([df1, df2]))

 

 

concat()의 ignore_index를 True로 설정하여 Index를 순차적으로 추가시킬 수 있습니다.

 

print(pd.concat([df1, df2], ignore_index=True))

 

 

concat()의 axis를 1로 설정하여 DataFrame을 행이 아닌 열 방향으로 추가시킬 수 있습니다.

이때 ignore_index를 True로 설정하면, 열(column) 이름이 중복되지 않도록 재설정할 수 있습니다.

 

print(pd.concat([df1, df2], axis=1))
# print(pd.concat([df1, df2], axis=1, ignore_index=True))

 

 

concat()의 join 파라미터를 이용하면 공통되는 열을 기준으로 DataFrame을 합칠 수 있습니다.

 

print(pd.concat([df1, df2], join='inner'))

 

 

● merge() 함수

 

pandas의 merge() 함수 또는 DataFrame의 merge() 메서드를 사용해 하나 이상의 키를 기준으로 두 DataFrame을 합칠 수 있습니다.

 

import pandas as pd

left = pd.DataFrame({'key': ['foo', 'bar', 'baz'], 'lval': [1, 2, 3]})
right = pd.DataFrame({'key': ['foo', 'bar', 'qux'], 'rval': [4, 5, 6]})

print(pd.merge(left, right, on='key'))
print()
print(pd.merge(left, right, on='key', how='outer'))
print()
print(left.merge(right, on='key'))

 

 

아래는 pandas의 merge() 함수에 대한 매개변수 정의입니다.

 

pandas.merge(left,
             right,
             how='inner',  # {‘left’, ‘right’, ‘outer’, ‘inner’, ‘cross’}, default ‘inner’
             on=None,  # label or list
             left_on=None,  # label or list, or array-like
             right_on=None,  # label or list, or array-like
             left_index=False,
             right_index=False,
             sort=False,
             suffixes=('_x', '_y'),
             copy=True,
             indicator=False,
             validate=None)

 

● groupby() 메서드

 

DataFrame의 groupby() 메서드를 사용해 DataFrame 내 데이터를 그룹핑할 수 있습니다.

 

import pandas as pd
import numpy as np

df = pd.DataFrame(
    {
        "A": ["foo", "bar", "foo", "bar", "foo", "bar", "foo", "foo"],
        "B": ["one", "one", "two", "three", "two", "two", "one", "three"],
        "C": np.random.randn(8),
        "D": np.random.randn(8),
    }
)

print(df)
print()
print(df.groupby('A').sum())
print()
print(df.groupby(['A', 'B']).sum())

 

 

df.count() 각 column 내 데이터의 개수를 반환. NaN 값은 포함되지 않음
- df[x].count()
- df.iloc[0].count()
df.describe() DataFrame 내 column 기준 mean, std emd 데이터 값에 대한 여러 정보를 반환
- <df 열>.describe()

count : 데이터 개수
mean : 평균
std : 표준편차
min : 최소값
25% : 1사분위값
50% : 중간값
75% : 3사분위값
max : 최대값
df.drop() DataFrame 내 임의 열 또는 행이 삭제된 DataFrame을 반환
- 파리미터 labels : 삭제할 index나 column에 대한 리스트 정보 입력
- 파라미터 index 또는 columns : 삭제할 index나 column에 대한 리스트 정보 입력
- 파라미터 axis : 0은 행, 1은 열을 의미
- 파라미터 inplace : True 시 원본 DataFrame에서 완전히 삭제됨
df.dtypes 각 column의 데이터 타입 정보를 반환
df.head(n) 처음을 기준으로 n개의 DataFrame을 반환. 기본 n=5
df.index DataFrame의 index 정보를 반환
df.info() DataFrame 관련 정보를 반환
df.nunique() DataFrame 내 column 기준 중복되지 않는 데이터의 개수를 반환
df.rename() index 또는 column의 이름 변경
-> rename(index={a:b}) 또는 rename(columns={a:b})
df.replace(a, b) DataFrame 내 a값(리스트)를 b값(리스트)로 변경
df.reset_index() index 재설정
- 파라미터 inplace : True 시 원본 DataFrame이 변경됨
df.sample(n) DataFrame에서 n개의 데이터를 샘플링
- 파라미터 frac : 추출하고자 하는 값(행)의 비율로 파라미터 n과 함께 사용하지 않음
- 파라미터 replace : True 시 추출된 값이 다시 추출될 수 있음
df.set_index(col) 전달된 column을 index로 하며 index의 값이 column 값인 DataFrame을 반환
df.shape 행과 열의 개수를 반환 (tuple)
df.shape[0] : 행의 개수를 반환
df.shape[1] : 열의 개수를 반환
df.sort_index( ) index의 값을 기준으로 정렬
- 파라미터 ascending : True는 오름차순, False는 내림차순으로 정렬
df.sort_values( ) column의 값 기준으로 정렬
- 파리미터 by : 정렬 기준 column으로 'a' 또는 ['a', 'b'] 등으로 설정
- 파라미터 ascending : True는 오름차순, False는 내림차순으로 정렬
df.sum()
-> df.mad()
-> df.mean()
-> df.median()
-> df.std()
-> df.quantile()
-> df.var()
DataFrame 내 column 기준 데이터 값의 합을 반환
- <df 열>.sum()

sum()의 파라미터 skipna를 False로 설정하느 경우, 계산하는 값에 NaN가 포함되어 있으면 nan를 반환
df.tail(n) 마지막을 기준으로 n개의 DataFrame을 반환. 기본 n=5
<df 열>.argmax() 데이터 값이 가장 큰 요소의 row 정보 반환
<df 열>.idxmax() 데이터 값이 가장 큰 요소의 index 정보 반환
<df 열>.max() column 내 가장 큰 데이터 값을 반환
<df 열>.min() column 내 가장 작은 데이터 값을 반환
<df 열>.value_counts() column 내 동일 데이터 값의 개수
<df 열>.unique() column에서 중복되지 않는 데이터 값을 리스트로 반환
astype() 열 기준 데이터 타입을 변경 : str, int, float, category
dropna() NaN 값을 가지는 열 및 행이 제외된 DataFrame 또는 Series 반환
fillna(v) NaN 값을 설정된 값(v)으로 변경된 DataFrame 또는 Series 반환
-> v : {col1: v1, col2: v2} 사용도 가능
isna() NaN 값은 True, 그렇지 않으면 False인 DataFrame 또는 Series 반환
-> isnull, notna(), notnull() 함수도 NaN 값 관련 확인을 위해 사용 가능
isin(a) a값(리스트)과 같으면 True, 다르면 False 값인 DataFrame 또는 Series 반환

 

melt() 함수

 

pandas의 melt() 함수 또는 DataFrame의 melt() 메서드는 열의 데이터를 행의 데이터로 변경하고자 할 때 사용할 수 있습니다.

 

import pandas as pd

data = pd.DataFrame({'key': ['foo', 'bar'],
                     'class': ['A', 'B'],
                     'v1': [1, 2],
                     'v2': [1, 2],
                     'v3': [1, 2],
                     'v4': [1, 2],
                     'v5': [1, 2],
                     'v6': [1, 2],
                     'v7': [1, 2],
                     'v8': [1, 2],
                     'v9': [1, 2],
                     'v10': [1, 2]})

print(data)
print()

print(data.melt(id_vars=['key', 'class'],
                # value_vars=[],
                var_name='Variable Name',
                value_name='Value Name'))

 

 

 pivot_table() 함수

 

import pandas as pd

df = pd.DataFrame({
    'A': ['foo', 'foo', 'foo', 'foo', 'foo', 'bar', 'bar', 'bar', 'bar'],
    'B': ['one', 'one', 'one', 'two', 'two', 'one', 'one', 'two', 'two'],
    'C': ['small', 'large', 'large', 'small', 'small', 'large', 'small', 'small', 'large'],
    'D': [1, 2, 2, 3, 3, 4, 5, 6, 7],
    'E': [2, 4, 5, 5, 6, 6, 8, 9, 9]})

print(df)
print()

print(df.pivot_table(values='D',
                     index=['A', 'B'],
                     columns='C'))

 

 

read_csv() 함수

 

pandas의 read_csv() 함수를 이용해 csv 파일을 읽어 올 수 있습니다.

  • 파라미터 header : column으로 사용할 row 정보 (default = 0) 
  • 파라미터 names : column으로 사용할 이름 리스트
  • 파라미터 index_col : index로 사용할 column 정보. 없을 시 index_col=False로 정의
  • 파라미터 encoding : 파일 인코딩 방식 설정. 한글의 경우 euc-kr 또는 cp949 등으로 설정이 필요할 수 있음

1) pandas로 읽어올 csv 파일을 준비합니다. 본 글에서는 한국은행에서 제공하는 소비자물가지수를 csv 포맷으로 다운로드합니다.

 

 

2) csv 파일을 읽어오는 코드를 작성합니다.

 

import pandas as pd

cpi = pd.read_csv('소비자물가지수_02223652.csv', index_col='계정항목')
cpi.index = [i.strip() for i in cpi.index]
cpi = cpi.drop(columns=['통계표', '단위', '가중치', '변환'])
cpi = cpi.T

print(cpi)
print()

print(cpi.isna().sum())
print()

print(cpi.columns)

 

  • pd.read_csv() 함수 호출 시 index_col을 이용해 '계정항목'을 index로 설정
  • '계정항목' 데이터(문자열)의 앞/뒤 공백 제거를 위해 strip() 함수 사용
  • cpi.drop() 메서드로 일부 column 제거
  • cpi.T로 열과 행을 바꿈
  • cpi.isna().sum() 메서드로 NaN 개수 확인