• 데이터 랭글링은 원본 데이터를 정제하고 사용가능한 형태로 구성하기 위한 변환 과정을 광범위하게 의미하는 비공식 용어
  • 데이터 랭글링은 데이터 전처리의 한 과정
  • 데이터 랭글링에서 사용되는 가장 일반적인 데이터 구조는 데이터프레임

 

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
  • 또는, 원본 데이터는 놔두고 데이터를 조작할 새로운 데이터프레임을 복사하여 만들면 좋음

+ Recent posts