이번에는 Pandas로 데이터를 가공하는 방법에 대해 알아보겠습니다.
import pandas as pd
file_path = './data/titanic_train.csv'
df = pd.read_csv(file_path)
인덱스, 행, 열
인덱스
인덱스는 데이터프레임에서 각 행의 이름입니다.
df.index
# RangeIndex(start=0, stop=891, step=1)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ..., 890]
rename()
함수를 이용해서 원하는 인덱스의 이름을 변경할 수 있습니다. index = 바꿀 인덱스명
을 이용하면 데이터 전체의 인덱스를 변경합니다.
df.rename({0:'row1', 1:'row2'})
df.index = df1.index = ['row' + str(i+1) for i in range(len(df1))]
기존에 있는 열을 인덱스로 설정하려면 set_index()
함수를 사용합니다.
df = df.set_index('PassengerId')
인덱스를 다시 데이터의 열로 만들고 싶다면 reset_index()
를 사용합니다. drop
값은 변환한 열을 삭제할지 여부입니다.
df.reset_index(drop=True)
행
행을 추가하고 싶다면 concat()
함수를 사용합니다.
pd.concat([data1, data2])
추가로, 합친 데이터의 인덱스를 다시 정렬하고 싶다면 위에서 사용해봤던 reset_index()
를 사용합니다.
특정 행을 삭제하고 싶다면 drop()
함수를 사용합니다. 중복을 제거하고 싶다면 drop_duplicates()
함수를 사용합니다.
pd.drop([2, 3, 4, 5])
열
열을 추가하는 것은 파이썬의 딕셔너리와 사용 방법이 같습니다.
df['given_name'] = [i[0] for i in df1['Name'].str.split(',')]
열을 삭제할 때는 행을 삭제할 때와 똑같이 drop()
함수를 사용합니다. 단, 열을 삭제한다는 것을 명시하기 위해 매개변수로 axis=1
값을 넘겨줍니다.
df.drop('given_name', axis=1)
열의 이름을 변경할 때는 인덱스의 이름을 변경할 때와 똑같습니다. 단, drop()
함수와 같이 axis=1
을 명시해 주어야 합니다.
df.rename({'PassengerId':'Id'}, axis=1)
df.columns = [i for i in range(12)]
결측치 처리하기
결측치를 처리하는 것은 데이터 전처리 과정에서 매우 중요한 과정입니다. isna()
와 notna()
는 둘 다 결측치를 확인하기 위한 함수입니다. isna()
는 결측치가 있을 경우 True를 반환하고, notna()
는 결측치가 있을 때 False를 반환합니다.
df.isna() # 결측치일 경우 True, 아닐 경우 False인 테이블을 반환합니다.
df.isna().sum() # 각 열 별로 결측치의 개수를 반환합니다.
이전에 조건식을 통해 원하는 데이터만 가져오는 방법에 대해 알아보았습니다. 이것을 이용하면 결측치가 있는 행만 가져올 수 있습니다.
df[df['Age'].isna()] # 데이터 중 Age 컬럼의 값이 존재하지 않는 행만 가져옵니다.
notna()
는 isna()
와 반대입니다. 결측치가 없는 경우에 True를 반환합니다.
df[df['Age'].notna()] # 데이터 중 Age 럼의 값이 존재하는 행만 가져옵니다.
결측치 제거하기
dropna()
함수를 이용하면 결측치가 있는 데이터를 제거할 수 있습니다.
df.dropna(axis=0, how='any', subset=['Cabin','Age'])
axis
:0|1
0은 기본값으로 행을 의미하고, 1은 열을 의미합니다.how
:any|all
any는 해당 열이나 행에 결측치가 하나라도 존재하면 삭제하고 all은 행(또는 열)의 모든 값이 결측치가어야만 제거합니다.subset
: 데이터를 제거할 행/열의 이름을 지정합니다.
결측치 대치
결측치를 전부 없애면 데이터의 양이 줄어들 수 있습니다. 데이터의 손실을 막기 위해 결측치를 적당한 다른 값으로 대치해서 사용할 수도 있습니다.
데이터명.fillna(대치할값)
: 데이터 전체의 결측치를 특정 값으로 변경합니다.데이터명[컬럼명].fillna(대치할값)
: 특정 컬럼의 결측치를 특정 값으로 변경합니다.데이터명.fillna(method='ffill')
: 결측치를 바로 위의 값과 동일하게 변경합니다.데이터명.fillna(method='bfill')
: 결측치를 바로 아래의 값과 동일하게 변경합니다.
데이터 타입 변환
분석을 위해, 데이터의 타입을 다른 값으로 변경해야 할 수도 있습니다. 데이터의 값을 변경하기 앞서, 각 열이 어떤 데이터 타입인지를 알아야 합니다.
df.dtype
df.select_dtypes('int')
dtype
을 사용하면 모든 열의 데이터 타입을, select_dtypes()
를 사용하면 특정 데이터 타입의 열을 조회할 수 있습니다. dtype
에서 문자열은 object
로 표현됩니다.
PassengerId int64
Survived int64
Pclass int64
Name object
Sex object
Age float64
SibSp int64
Parch int64
Ticket object
Fare float64
Cabin object
Embarked object
dtype: object
데이터 타입을 변경하려면, astype()
함수를 사용합니다.
df['PassengerId'].astype(str)
# PassengerId object
Age 컬럼이 실수 형식이기 때문에 정수로 변경해 보겠습니다.
df['Age'].astype(int)
# IntCastingNaNError: Cannot convert non-finite values (NA or inf) to integer
Age 컬럼의 타입을 변경하려고 하면 에러나 납니다. 왜 그럴까요? 그것은 결측치가 있기 때문입니다. 그럴 경우, 위에서 배운 fillna()
를 이용해서 정수 형태로 만들어준 다음 변환합니다.
df['Age'].fillna(-1).astype(int)
Pandas를 이용한 데이터 가공: 날짜 다루기, 사용자 정의 함수 적용하기, 데이터 결합하기
날짜 다루기다음으로, 날짜를 다루는 방법에 대해 알아보겠습니다. 날짜가 문자형으로 되어 있다면 날짜 계산이 불가능합니다. 날짜를 날짜형 데이터로 변경해주어야 날짜를 계산할 수 있습니
dararium.tistory.com
'데이터 분석 > 강의 노트' 카테고리의 다른 글
웹 크롤링으로 데이터 가져오기 (0) | 2024.07.07 |
---|---|
Pandas: 날짜 다루기, 사용자 정의 함수 적용하기, 데이터 결합하기 (0) | 2024.07.04 |
Pandas: Series와 DataFrame, 데이터 불러오기, 조건에 맞는 데이터 추출하기 (0) | 2024.07.04 |
데이터 시각화: 엑셀을 이용해 다양한 차트 만들기 (0) | 2024.06.27 |
데이터 분석과 모델링(2) : 엑셀을 통해 다중 선형 회귀 분석과 시계열 분석 해보기 (0) | 2024.06.27 |