Pandas는 데이터 분석을 위해 만들어진 파이썬 라이브러리입니다. 배열 계산에 특화된 NumPy를 기반으로 하는 Pandas는 구조화된 데이터를 빠르고 효율적으로 처리할 수 있다는 장점이 있습니다.
① Pandas 호출하기
>>> import pandas as pd # Pandas 라이브러리를 pd라는 별칭으로 불러오기
② Series와 DataFrame
Pandas가 다루는 데이터 형태에는 Series와 DataFrame이 있습니다. 먼저 각각의 데이터들을 생성하는 방법을 알아본 뒤, 데이터들을 조작하는 방법에 대해서 알아봅시다.
1) Series
Series 데이터는 NumPy의 배열에서 조금 더 보강된 형태입니다. Series의 인덱스는 기본값이 0부터 시작하는 정수값인데, 인덱싱 방법을 다른 숫자나 문자, 문자열로 지정할 수 있습니다. Series의 데이터 값들은 ndarray 형태로 저장됩니다.
>>> data = pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])
>>> data['c']
3
>>> type(data.values)
<class 'numpy.ndarray'>
Series를 생성하기 위해서 앞선 예처럼 리스트를 전달하는 것도 가능하지만, 딕셔너리를 전달할 수도 있습니다.
>>> population_dict = {
... 'korea': 51,
... 'japan': 125,
... 'usa': 331
... }
>>> population_series = pd.Series(population_dict)
>>> population_series
korea 51
japan 125
usa 331
dtype: int64
2) DataFrame
DataFrame 데이터는 여러 개의 Series가 모여서 행과 열을 이룹니다.
>>> gdp_dict = {
... 'korea' = 17,
... 'japan' = 43,
... 'usa' = 250
... }
>>> gdp_series = pd.Series(gdp_dict)
>>> country = pd.DataFrame({
... 'gdp': gdp_series,
... 'population': population_series
... })
>>> country
gdp population
japan 43 125
korea 17 51
usa 250 331
Series를 생성할 때처럼, DataFrame을 생성할 때도 딕셔너리를 이용할 수 있습니다. 이때 딕셔너리가 가지고 있는 속성 중 하나를 set_index 메소드를 통해 인덱스로 지정할 수 있습니다.
>>> country_info = {
... 'country': ['japan', 'korea', 'usa'],
... 'gdp': [43, 17, 250],
... 'population': [125, 51, 331]
... }
>>> country_df = pd.DataFrame(country_info)
>>> country_df
country gdp population
0 japan 43 125
1 korea 17 51
2 usa 250 331
>>> country_df = country_df.set_index('country') # 인덱스 지정
>>> country_df
gdp population
country
japan 43 125
korea 17 51
usa 250 331
앞서 인덱스로 사용할 속성을 지정했다면, 인덱스와 속성들 자체에 이름을 붙일 수 있습니다.
>>> country_df.index.name = "Country"
>>> country_df.columns.name = "Info"
>>> country_df.index
Index(['japan', 'korea', 'usa'], dtype='object', name='Country')
>>> country_df.columns
Index(['gdp', 'population'], dtype='object', name='Info')
③ 데이터 선택
3-1) 컬럼 선택
DataFrame에서 특정 컬럼만 추출할 때는 우리가 지정한 컬럼명을 활용할 수 있습니다.
>>> country_df['gdp'] # Series 추출
country
japan 43
korea 17
usa 250
Name: gdp, dtype: object
>>> country_df[['gdp']] # DataFrame 추출
gdp
country
japan 43
korea 17
usa 250
3-2) 인덱싱 & 슬라이싱
loc 메소드는 명시적인 인덱스를 참조하여 데이터를 인덱싱/슬라이싱할 수 있습니다. 즉, 우리가 지정한 인덱스의 이름으로 데이터를 선택하는 것입니다.
그런데 loc 메소드를 통해 슬라이싱을 할 때 주의할 점은, 시작 값과 마지막 값이 둘 다 포함된다는 것입니다. 우리가 익숙한 슬라이싱 방식은 다음과 같이 시작 값은 포함되고 마지막 값은 포함되지 않는 방식입니다. 예시와 코드를 참고해서 그 차이점을 기억합시다.
예시) exList[1:4] -> exList[1], exList[2], exList[3]
>>> country_df2.loc['korea'] # 인덱싱
gdp 17
population 51
NameL korea, dtype: int64
>>> country_df2.loc['japan':'korea', :'population'] # 슬라이싱 (Endpoints Inclusive)
gdp population
country
japan 43 125
korea 17 51
iloc 메소드는 사용자가 지정한 인덱스가 아닌, 파이썬 스타일의 정수 인덱싱/슬라이싱을 사용합니다. 우리가 익숙한 0부터 시작하는 인덱싱이자 마지막 값을 포함하지 않는 슬라이싱 방식입니다.
>>> country_df2.iloc[1] # 인덱싱
gdp 17
population 51
NameL korea, dtype: int64
>>> country_df2.iloc[0:2, :2] # 슬라이싱 (Endpoints Exclusive)
gdp population
country
japan 43 125
korea 17 51
3-3) 조건문 활용
Boolean 표현식이나 query 함수를 활용하여 특정한 조건들을 만족하는 데이터들만 추출하는 것도 가능합니다.
>>> country_df[country_df['population'] < 100]
gdp population
country
korea 17 51
>>> country_df.query("gdp > 200")
gdp population
country
usa 250 331
④ 데이터 변경
4-1) 데이터 추가 및 수정
이미 존재하는 데이터프레임에 리스트나 딕셔너리로 새로운 데이터를 추가할 수 있습니다.
>>> country_df.loc['china'] = [183, 1412] # 리스트로 전달
>>> country_df.loc['uk'] = {'gdp': 31, 'population': 67} # 딕셔너리로 전달
4-2) NaN 컬럼 추가
Pandas 라이브러리에서는 np.nan 값으로 비어 있는 데이터를 표현합니다. 따라서 새로운 컬럼을 NaN으로 초기화한 뒤, 나중에 적절한 데이터를 채울 수 있습니다. NaN 값은 각종 연산 과정에서 포함되지 않는 것이 기본 설정 값입니다.
>>> country_df['Capital'] = np.nan
>>> country_df['korea', 'Capital'] = 'Seoul'
4-3) 데이터 삭제
drop 메소드로 데이터프레임의 행이나 열을 삭제할 수 있습니다.
* axis = 0 : 행 삭제 / axis = 1 : 열 삭제
** inplace = True : 원본 변경 O / inplace = False : 원본 변경 X
>>> country_df.drop('gdp', axis = 1, inplace = True)
'데이터 분석 > 기초' 카테고리의 다른 글
[Python] Pandas 라이브러리 기초 2 (0) | 2023.02.03 |
---|---|
[Python] NumPy 라이브러리 기초 2 (0) | 2022.11.24 |
[Python] NumPy 라이브러리 기초 1 (0) | 2022.11.21 |
[Python] 모듈과 패키지 (0) | 2022.10.22 |
[Python] 함수(Function)와 메서드(Method)의 차이 (0) | 2022.10.09 |