Programming Language/Python

[Python] Pandas package - 1

LeeJaeJun 2023. 12. 29. 10:13
728x90
반응형

pandas 패키지는 1차원 배열인 시리즈(Series)  행과 열로 이루어진 2차원 배열인 데이터프레임(DataFrame)을 통해 데이터 분석 업무를 쉽게 처리할 수 있게 해줍니다.

 

- 시리즈(Series)

  • 데이터가 순차적으로 나열된 1차원 배열
  • 인덱스(index)와 값(value)은 1대1 대응 관계이며, 이는 키(Key)와 값(value)의 형태로 구성된 딕셔너리와 비슷합니다.
import pandas as pd

dict_data = {'a':1, 'b': 2, 'c':3}
series = pd.Series(dict_data) # dictionary를 통해서 series 만들기. key값이 인덱스가 됨.

series.index # series의 index 반환
series.values # series의 value 반환

list_data = ['a','b','c']
series_2 = pd.Series(list_data) # list를 통해서 series 만들기. index는 정수형 위치 인덱스로 자동으로 지정

series_3 = pd.Series(list_data, index = ['index1','index2','index3']) # 직접 인덱스 설정

capital = pd.Series({'Korea':'Seoul',
					'Japan':'Tokyo',
                    'China':'Beijing',
                    'India':'New Delhi',
                    'Taiwan':'Taipei',
                    'Singapore':'Singapore'
                    })
capital['Korea'] # Korea index의 value
capital['Korea','Taiwan'] # Korea와 Taiwan index의 value(series 형태)
captial[0] # 0번째 index의 value. 즉, 여기서는 Korea의 value
capital[[0,3]] # 0번째와 3번째의 index의 value.
capital[0:3] # 0이상 3미만의 index의 value.

# series의 사칙연산
series_4 = pd.Series([1,2,3])
series_5 = pd.Series([4,5,6])

series_1 + series_2 # 각각의 인덱스가 같은 값끼리 연산
series_1 * 2 # 모든 원소에 연산이 적용

 

- 데이터프레임(DataFrame)

  • 2차원 배열
  • 행과 열로 이루어진 테이블 형태
  • 데이터프레임의 각 열은 시리즈 객체
  • 시리즈가 열 방향으로 모여 데이터프레임을 구성
  • 데이터프레임을 만들기 위해서는 원소의 개수가 동일한 1차원 배열이 여러 개 필요
import pandas as pd

dict_data = {'col1': [1,2,3], 'col2': [4,5,6], 'col3':[7,8,9]}
df = pd.DataFrame(dict_data) # dictionary로 DataFrame 만들기

df2 = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]]) # list로 DataFrame 만들기. 인덱스는 자동으로 정수형

df3 = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]],
					index=['index1','index2','index3'],
                    columns=['col1','col2','col3']) # 직접 인덱스, 열이름 설정
                    
df3.index = ['행1','행2','행3'] # 만들어진 DateFrame의 index 변경

df3.columns = ['열1','열2','열3'] # 만들어진 DataFrame의 columns 변경

df3.rename(index={'행1': '첫 번째 행'}, inplace=True) # 행 인덱스나 열 이름 중 원하는 부분만 변경. inplace = True하면 원본데이터 변경
df3.rename(columns={'열1': '첫 번째 열'}, inplace=True)

df3.drop('행 3', axis=0, inplace = True) # drop()메서드는 행 혹은 열 삭제. 행을 삭제할 때는 axis = 0. 즉 DataFrame.drop(행 이름, axis = 0)
df3.drop('열 3', axis=1, inplace = True) # 열을 삭제할 때는 axis=1. 즉 DataFrame.drop(열 이름, axis = 1)

# 열을 하나만 선택
# DataFrame['열 이름'] (type은 series)
# DataFrame.열 이름. 열 이름이 문자열인 경우에만 가능 (type은 series
# DataFrame[['열 이름']] (type은 DataFrame)

# 열을 여러 개 선택
# DataFrame[['열 이름1', '열 이름2']]

# 행 데이터 선택
# DataFrame.loc['행 이름']. loc .,.,: 인덱스 이름을 기준으로 행을 선택할 때 사용 (type은 series)
# DataFrame.iloc[인덱스 위치]. iloc: 위치 인덱스를 기준으로 행을 선택할 때 사용 (type은 series)
# 데이터 프레임 형태로 반환하고 싶다면 2중 대괄호[['행 이름']] , [[인덱스 위치]] 사용
# slice도 사용가능. loc는 범위의 끝을 포함, iloc은 범위의 끝을 제외

# 행과 열 선택
# DataFrame.loc['행 인덱스', '열 이름']
# DataFrame.iloc[행 위치, 열 위치]
# 여러 개 선택할 때는 2중 대괄호
# slice도 사용 가능.

 

- 데이터 불러오고 저장하기

파일 포맷 불러오기  저장하기
CSV read_csv() to_csv()
EXCEL read_excel() to_excel()
SQL read_sql() to_sql()
HTML read_html() to_html()
JSON read_json() to_json()
HDF5 read_hdf() to_hdf()

 

- 데이터 요약 및 통계값 계산

DataFrame.head(n) : 데이터의 맨 위 살펴보기

DataFrame.tail(n): 데이터의 맨 아래 살펴보기

* n에 정수를 입력하면 맨 위 혹은 아래의 n개 행을 보여주고, 값을 입력하지 않으면 기본값인 5개 행을 보여줍니다.

DataFrame.shape: 데이터프레임의 행과 열의 갯수(tuble 형태)

DataFrame.info: 데이터프레임의 기본정보

DataFrame['열 이름'].value_counts() : 각 열의 고유값 개수. 리스트 형태로 여러 개의 열을 작성하여 다중 열을 기준으로 메세지 적용 가능. value_counts 안에 normalize = True라고 하면 비율로 표현. 

DataFrame['열 이름'].value_counts().sort_index() : 인덱스 정렬

DataFrame['열 이름'].mean() : 해당 열 평균구하기. 리스트 형태로 여러 개의 열을 작성하여 여러 열의 평균을 계산할 수 있습니다.

DataFrame['열 이름'].min() : 최솟값

DataFrame['열 이름'].max() : 최댓값

DataFrame['열 이름'].median() : 중간값

 

* NaN : Not a Number. 결측치 혹은 누락값. 데이터를 입력할 때 빠지거나 소실된 값. 이것이 많아지면 데이터의 품질이 떨어지고 제대로된 분석을 할 수 없기에 적절하게 처리하는 과정이 필요.

 

- 결측치 찾기

isnull(): 결측치면 True, 유효한 데이터면 False 반환

notnull(): 유효한 데이터면 True, 결측치면 False 반환

결측치를 다루는 가장 간단한 방법은 결측치가 있는 행 또는 열을 삭제하는 것입니다.

Dataframe.dropna(): 결측치 삭제(결측치가 있는 행을 모두 삭제)

DataFrame.dripna(subset = ['열 이름'], axis = 0): subset은 기준 열. axis = 0은 행 방향 -> 해당 열에서 결측치가 있는 데이터만 삭제. 

DataFrame.dripna(axis = 1) : axis = 1을 하면 결측치가 있는 열을 삭제할 것임.

DataFrame.dripna(axis = 1, thresh = n) : 결측지가 n개 이상인 열을 삭제.

DataFrame['열 이름'].fillna(n, inplace = True) : null값을 n으로 채우기.

DataFrame['열 이름'].fillna(method='ffill')   : 결측치가 있는 경우 위의 행 중 결측치가 나타나기 전의 값으로 바꿔줌. (예를 들어, 시계열 데이터는 서로 이웃하고 있는 데이터끼리 유사성을 가질 가능성이 높은데 이럴 경우 사용)

DataFrame['열 이름'].fillna(method='bfill') : 결측치가 있는 경우 아래의 행 중 결측치가 아닌 첫 번째 값으로 바꿔줌.

 

-인덱스 다루기

DataFrame.set_index('열 이름', inplace = True): 해당 열이 인덱스로 설정됩니다.

DataFrame.sort_index(inplace = True) : 인덱스가 오름차순으로 정렬됩니다.

DataFrame.sort_index(inplace = True, ascending = False): 인덱스가 내림차순으로 정렵됩니다.

DataFrame.reset_index(inplace = True): 인덱스 초기화(재설정). 인덱스가 위치 인덱스로 다시 초기화

 

- 필터링

DataFrame['열 이름'].unique(): 고유한 값을 반환

DataFrame['열 이름'] == 값 : 값와 같은 행은 True, 다른 행은 Fasle

DataFrame.loc[ filter , ] : , 뒤 아무 것도 안쓰면 모든 열을 의미하므로 filter에 해당하는 값을 추출. and, or 등을 이용하여 필터에 여러개의 조건을 넣을 수 있습니다.

DataFrame['열 이름'].isin('값1' , '값2') : 해당 열에 isin() 내부의 값이 포함되어 있으면 True를 반환합니다.

728x90
반응형