- 데이터 랭글링은 원본 데이터를 정제하고 사용가능한 형태로 구성하기 위한 변환 과정을 광범위하게 의미하는 비공식 용어
- 데이터 랭글링은 데이터 전처리의 한 과정
- 데이터 랭글링에서 사용되는 가장 일반적인 데이터 구조는 데이터프레임
1. 데이터프레임 만들기
# 방법 1
import pandas as pd
df = pd.DataFrame()
df['Name'] = ['Jacky Jackson', 'Steven Stevenson']
df['Age'] = [38, 25]
df['Driver'] = [True, False]
df
# 방법 2(numpy 배열을 dataframe으로)
import numpy as np
data = [['Jacky Jackson', 38, True], ['Steven Stevencon', 25, False]]
matrix = np.array(data)
pd.DataFrame(matrix, columns = ['Name', 'Age', 'Driver'])
# or
pd.DataFrame(data, columns = ['Name', 'Age', 'Driver'])
# 방법 3(dictionary를 dataframe으로)
data = {'Name': ['Jacky Jackson', 'Steven Stevenson'],
'Age': [38, 25],
'Driver': [True, False]}
pd.DataFrame(data)
# 방법 4(각각의 데이터를 dictionary로, 각 dictionary를 병합)
data = [{'Name': 'Jacky Jackson', 'Age': 25, 'Driver': True},
{'Name': 'Steven Stevenson', 'Age': 38, 'Driver': False}]
# 인덱스 따로 지정 가능
pd.DataFrame(data, index = ['row1', 'row2'])
2. 데이터 설명하기
- 데이터를 적재한 후 확인하는 가장 간단한 방법은 head()를 통해 상위 몇 개의 데이터만 출력해서 확인해보는 것
- tail()을 사용하면 하위 데이터 출력
df = pd.read_csv('titanic.csv')
# 데이터의 상위 2행만 출력
df.head(2)
- 데이터의 열과 행의 개수 확인
df.shape
# 출력 결과
(891, 12)
- describe()를 사용하여 숫자데이터 열의 통계값 확인
df.describe()
3. 데이터프레임 탐색하기
- loc 또는 iloc를 사용해 하나 이상의 행이나 값을 선택
- loc와 iloc 슬라이싱은 numpy와 달리 마지막 인덱스를 포함
# 첫번째 행 출력
df.iloc[0]
# 출력 결과
PassengerId 1
Survived 0
Pclass 3
Name Braund, Mr. Owen Harris
Sex male
Age 22.0
SibSp 1
Parch 0
Ticket A/5 21171
Fare 7.25
Cabin NaN
Embarked S
Name: 0, dtype: object
# 콜론(:)을 사용하여 행 슬라이싱
# 첫번째 행부터 네번째 행까지 출력
df.iloc[1:4]
# 슬라이싱의 첫 부분을 공백으로 두면 처음부터 선택
# 슬라이싱의 마지막 부분을 공백으로 두면 마지막까지 선택
df.iloc[:4]
# 데이터프레임에서 행마다 고유한 값을 갖는 특정 열을 인덱스로 설정
# loc를 사용해 고유값으로 해당 행을 슬라이싱 가능
df_name_index = df.set_index(df['Name'])
df_name_index.loc['Braund, Mr. Owen Harris']
# 출력 결과
PassengerId 1
Survived 0
Pclass 3
Name Braund, Mr. Owen Harris
Sex male
Age 22.0
SibSp 1
Parch 0
Ticket A/5 21171
Fare 7.25
Cabin NaN
Embarked S
Name: Braund, Mr. Owen Harris, dtype: object
# 열을 선택하여 선택한 열만 출력하기도 가능
df[['Age', 'Sex']].head(2)
4. 조건에 따라 행 선택하기
# 데이터프레임 df[] 안에 조건문인 df['Sex'] == female을 넣어서 True인 행만 출력
df[df['Sex'] == 'female'].head(2)
# &를 사용해 조건 두 개이상도 검색 가능
df[(df['Sex'] == 'female') & (df['Age'] >= 60)].head(2)
5. 값 치환하기
df['Sex'].replace('female', 'woman').head(2)
# 출력 결과
0 male
1 woman
Name: Sex, dtype: object
# 두 개 이상도 한번에 치환 가능
df['Sex'].replace(['female', 'male'], ['woman', 'man']).head(5)
# 출력 결과
0 man
1 woman
2 woman
3 woman
4 man
Name: Sex, dtype: object
# 한번에 여러 값은 하나의 값으로 치환 가능
df['Sex'].replace(['female', 'male'], 'person').head(5)
# 출력 결과
0 person
1 person
2 person
3 person
4 person
Name: Sex, dtype: object
# 치환할 여러 값을 딕셔너리 형태로 전달 가능
df['Sex'].replace({'female' : 1, 'male' : 0}).head(5)
# 출력 결과
0 0
1 1
2 1
3 1
4 0
Name: Sex, dtype: int64
# 위에서 하나의 열뿐 아니라 데이터프레임 전체의 모든 값을 한번에 치환 가능
df.replace(1, 'one').head(2)
6. 열 이름 바꾸기
df.rename(columns = {'Pclass' : 'Passenger Class'}).head(2)
- 전체 열 이름을 바꿀 때 열이 많아 각각 입력하기 힘들다면 열 이름은 키로, 값은 비어있는 딕셔너리로 만들어 비어있는 값에 바꿀 열 이름을 넣어서 rename()에 전달하면 편리함
import collections
column_names = collections.defaultdict(str)
for name in df.columns:
column_names[name]
column_names
# 출력 결과
defaultdict(str,
{'PassengerId': '',
'Survived': '',
'Pclass': '',
'Name': '',
'Sex': '',
'Age': '',
'SibSp': '',
'Parch': '',
'Ticket': '',
'Fare': '',
'Cabin': '',
'Embarked': ''})
- rename(columns = {}) 대신 rename(index = {})으로 인덱스 치환가능
df.rename(index = {0:-1}).head(2)
- 열 이름 소문자로 바꾸기
# 변환 함수 전달
df.rename(str.lower, axis = 'columns').head(2)
7. 최소값, 최대값, 합, 평균 계산 및 개수 세기
- 각 통계값에 맞는 메서드 사용
- 최대값: max()
- 최소값: min()
- 평균: mean()
- 합: sum()
- 개수: count()
- 분산: var()
- 표준편차: std()
- 첨도: kurt()
- 왜도: skew()
- 평균의 표준오차: sem()
- 최빈값: mode()
- 중간값: median()
- 상관계수: corr()
- 공분산: cov()
print('최대값:', df['Age'].max())
print('최th값:', df['Age'].min())
print('평균:', df['Age'].mean())
print('합:', df['Age'].sum())
print('카운트:', df['Age'].count())
# 출력 결과
최대값: 80.0
최th값: 0.42
평균: 29.69911764705882
합: 21205.17
카운트: 714
- 데이터프레임 전체에도 적용 가능
df.count()
# 출력 결과
PassengerId 891
Survived 891
Pclass 891
Name 891
Sex 891
Age 714
SibSp 891
Parch 891
Ticket 891
Fare 891
Cabin 204
Embarked 889
dtype: int64
8. 고유값 찾기
- unique 메서드를 사용해 열에서 고유한 값을 모두 찾음
df['Sex'].unique()
# 출력 결과
array(['male', 'female'], dtype=object)
- nunique 메서드는 unique 값의 개수를 출력
df['Sex'].nunique()
# 출력 결과
2
# nunique는 데이터프레임 전체에 적용 가능
df.nunique()
# 출력 결과
PassengerId 891
Survived 2
Pclass 3
Name 891
Sex 2
Age 88
SibSp 7
Parch 7
Ticket 681
Fare 248
Cabin 147
Embarked 3
dtype: int64
- value_counts() 메서드를 사용해 열에서 고유한 값 각각의 개수 출력
df['Sex'].value_counts()
# 출력 결과
Sex
male 577
female 314
Name: count, dtype: int64
9. 누락된 값 다루기
- isnull()과 notnull() 메서드는 null인지 아닌지에 대한 답을 boolean값(True나 False)으로 나타냄
# 조건으로 isnull()을 주어 True나 False의 값이 나오므로 True인 행만 찾아 출력 가능
df[df['Age'].isnull()].head()
- read_csv() 메서드에서 na_values = [] 옵션을 사용해 null 값으로 선언할 값들은 지정
- read_csv() 메서드에서 keep_default_na 옵션을 False로 하여 pandas에서 기본적으로 null 값으로 인식하는 값을을 null값이 아니게 만들 수 있음
- read_csv() 메서드에서 na_filter 옵션을 False로 하면 NaN 변환을 하지 않음
10. 열 삭제하기
- drop() 메서드 사용
# 축은 열을 나타내는 1로 지정
df.drop('Age', axis = 1)
- 한 번에 여러개의 열 삭제 가능
df.drop(['Age', 'Sex'], axis = 1)
- 열 이름이 없다면 열의 인덱스 번호를 사용해 삭제 가능
# 인덱스가 1인 열(두번째 열) 삭제
df.drop(df.columns[1], axis = 1)
- del df['Age']를 사용해 열을 삭제할 수 있지만 이는 원보 데이터프레임을 바꿔 원본 데이터의 손상을 유발할 수 있어 추천 X
- inplace = True 옵션을 사용해도 원본 데이터가 변형되므로 사용 X
- 또는, 원본 데이터는 놔두고 데이터를 조작할 새로운 데이터프레임을 복사하여 만들면 좋음
'Python > 기본문법' 카테고리의 다른 글
데이터 랭글링 (2) (0) | 2023.06.26 |
---|---|
데이터 적재 (0) | 2023.06.22 |
Numpy로 배열, 벡터, 행렬 이해하기 (3) (0) | 2022.10.20 |
Numpy로 배열, 벡터, 행렬 이해하기 (2) (0) | 2022.10.19 |
Numpy로 배열, 벡터, 행렬 이해하기 (1) (0) | 2022.10.17 |