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 개수 확인
'코딩 > 파이썬과 데이터 사이언스' 카테고리의 다른 글
파이썬과 데이터 사이언스 : seaborn 제공 mpg 및 그외 데이터셋 (0) | 2022.09.08 |
---|---|
파이썬과 데이터 사이언스 : pandas로 CSV 파일 읽어올 때 encoding 문제 해결 (0) | 2022.09.04 |
파이썬과 데이터 사이언스 : seaborn 라이브러리 (0) | 2022.09.03 |
파이썬과 데이터 사이언스 : matplotlib 라이브러리 (0) | 2022.09.02 |
파이썬과 데이터 사이언스 : NumPy 라이브러리 (0) | 2022.08.21 |