[Pandas 강좌 – 5] Pandas(판다스)를 통한 데이터 조작 및 변형(결측치 처리, 데이터 타입 변환 등)

데이터 분석을 위해 데이터를 조작하고 변형하는 작업은 필수적입니다. Pandas는 이러한 데이터 전처리 작업을 쉽게 할 수 있는 다양한 기능을 제공합니다.

 


1. 결측치 처리(NaN)

 

Pandas에서는 isnull이나 notnull 메소드를 사용하여 결측치를 확인할 수 있습니다. 또한 dropna나 fillna 메소드를 사용하여 결측치를 제거하거나 다른 값으로 채울 수 있습니다.

 

아래 코드에서는 isnull(), dropna(), fillna() 함수를 통해 결측치를 처리합니다. isnull()은 DataFrame내의 결측치를 확인하는데 사용됩니다. 각 값이 결측치인지 아닌지를 나타내는 Boolean값(True 또는 False)를 반환합니다. 여기서 True는 결측치를 의미합니다. dropna()는 결측치를 포함하는 행 또는 열을 제거하는데 사용됩니다. 기본적으로 행을 제거하지만, 매개변수를 조정하여 열을 제거하도록 설정할 수도 있습니다. fillna()는 결측치를 다른 값으로 대체하는데 사용됩니다. 아래 코드에서는 결측치를 0으로 대체합니다.

 

코드는 A, B, C라는 세 개의 열을 가진 DataFame을 생성합니다. np.nan은 결측치를 의미하므로, A열의 두 번째 값과 B열의 첫 번째 값은 결측치입니다. 먼저 isnull()함수를 사용하여 각 값이 결측치인지 확인합니다. 그리고 dropna()함수를 사용하여 결측치를 포함하는 모든 행을 제거합니다. 이 경우 ,A열의 두 번째 행과 B열의 첫 번째 행에 결측치가 있으므로, 해당 행들이 제거됩니다. 마지막으로 fillna(0) 함수를 사용하여 결측치를 0으로 대체합니다.

 

import pandas as pd
import numpy as np

# DataFrame 생성
df = pd.DataFrame({
   'A': [1, np.nan, 3],
   'B': [np.nan, 5, 6],
   'C': [7, 8, 9]
})

# 결측치 확인
print(df.isnull())

#       A      B      C
#0  False   True  False
#1   True  False  False
#2  False  False  False

# 결측치 제거
df_dropna = df.dropna()
print(df_dropna)

#     A    B  C
#2  3.0  6.0  9

# 결측치를 0으로 채우기
df_fillna = df.fillna(0)
print(df_fillna)

#     A    B  C
#0  1.0  0.0  7
#1  0.0  5.0  8
#2  3.0  6.0  9

 


2. 중복된 데이터 처리

 

Pandas에서는 duplicated(), drop_duplicates()를 사용하여 중복된 데이터를 처리할 수 있습니다. duplicated()는 DataFrame의 각 행이 중복인지 아닌지를 판단합니다. 중복된 행은 True로 표시되고, 중복되지 않은 행은 False로 표시됩니다. drop_duplicates는 DataFrame에서 중복된 행을 제거합니다. 기본적으로 첫 번째 등장하는 행을 유지하고 그 후에 나타나는 중복 행을 제거합니다. 이 함수는 원본 DataFrame을 수정하지 않고 새로운 DataFrame을 반환합니다.

 

코드는 A, B, C라는 세 개의 열을 가진 DataFrame을 생성합니다. 여기서 두 번째 행과 세 번째 행이 동일하므로 중복된 데이터가 있습니다. duplicated() 함수를 사용하여 각 행이 중복인지 확인합니다. 여기서 두 번째 행과 세 번째 행이 동일하므로 세 번째 행에서 True가 반환됩니다. 마지막으로 drop_duplicates() 함수를 사용하여 중복 행을 제거합니다.

 

import pandas as pd

# DataFrame 생성
df = pd.DataFrame({
   'A': [1, 2, 2],
   'B': [3, 4, 4],
   'C': [5, 6, 6]
})

# 중복 데이터 확인
print(df.duplicated())

#0    False
#1    False
#2     True

# 중복 데이터 제거
df_dropped = df.drop_duplicates()
print(df_dropped)

#   A  B  C
#0  1  3  5
#1  2  4  6

 


3. 데이터 타입 변환

 

Pandas에서는 데이터 타입을 변환하는데 다양한 방법들이 있습니다. 데이터 타입 변환은 분석이나 데이터 처리에 필요한 특정 타입으로 데이터를 변환하는 과정을 의미합니다.

 

astype()은 Pandas 객체를 지정된 데이터 타입으로 변환합니다. 예를 들어 아래 코드 처럼 DataFrame의 특정 열이 숫자로 되어 있을 때 이를 문자열로 바꾸고 싶을 때 사용할 수 있습니다.

 

df['column_name'] = df['column_name'].astype(str)

 

to_datetime()은 문자열을 datetime객체로 변환하는데 사용됩니다. 이 함수는 다양한 날짜/시간 형식의 문자열을 처리할 수 있습니다. 예를 들어 아래 코드처럼 날짜를 나타내는 문자열이 있고 이를 datetime객체로 변환할 때 사용할 수 있습니다.

 

df['date_column'] = pd.to_datetime(df['date_column'])

 

to_numeric()는 숫자로 변환할 수 있는 문자열을 숫자로 변환합니다. errors 매개변수를 'coerce'로 설정하면 변환할 수 없는 값은 NaN으로 처리됩니다.

 

df['numeric_column'] = pd.to_numeric(df['numeric_column'], errors='coerce')

 

to_timedelta()는 문자열, 숫자, 또는 timedelta 값을 표현하는 다른 시퀀스를 Timedelta 객체로 변환합니다.

 

df['timedelta_column'] = pd.to_timedelta(df['timedelta_column'])

 


4. Column 이름 변경

 

Pandas DataFrame에서 열 이름(또는 컬럼 이름)을 변경하는 방법은 여러 가지가 있습니다. 여기에서는 rename()과 columns 속성 변경, set_axis() 을 통해 Column의 이름을 변경해보겠습니다.

 

rename()은 원하는 Column의 이름을 쉽게 변경할 수 있는 함수입니다. 아래 코드 처럼 함수 내에서 dictionary형태로 기존 이름을 새 이름으로 매핑합니다. 이 함수는 원본 DataFrame을 직접 변경하지 않고 새로운 DataFrame을 반환합니다.

 

df = df.rename(columns={'old_name1': 'new_name1', 'old_name2': 'new_name2'})

 

columns 속성 변경은 DataFrame의 columns 속성을 사용하여 모든 columns 이름을 새로운 값으로 바꿀 수 있습니다. 새로운 columns 이름 리스트의 길이는 반드시 원본 DataFrame의 columns 수와 일치해야합니다.

 

df.columns = ['new_name1', 'new_name2', 'new_name3']

 

set_axis()는 rename()과 비슷하게 작동하지만, axis 매개변수를 사용하여 columns 이름뿐만 아니라 index이름도 변경할 수 있습니다. set_axis() 함수도 원본 DataFrame을 직접 변경하지 않고 새로운 DataFrame을 반환합니다. 만약 원본 DataFrame을 변경하고자 하면 inplace=True 옵션을 사용해야합니다.

 

df.set_axis(['new_name1', 'new_name2', 'new_name3'], axis=1, inplace=True)

 


5. Column 추가 및 삭제

 

Pandas에서 column을 추가하거나 삭제하는 방법은 다양합니다. 먼저 Column 추가 및 삭제를 위한 간단한 DataFrame을 만들겠습니다.

 

import pandas as pd

df = pd.DataFrame({
   'A': [1, 2, 3],
   'B': [4, 5, 6],
   'C': [7, 8, 9]
})

print(df)

#   A  B  C
#0  1  4  7
#1  2  5  8
#2  3  6  9

 

가장 간단한 방법은 새로운 열을 인덱싱하고 값을 할당하는 것입니다. 이때 value는 여러 가지 형태가 될 수 있습니다. 하나의 값을 할당하면 해당 값이 모든 행에 대해 동일하게 할당되고, 리스트나 배열을 할당하면 각 행에 다른 값이 할당됩니다.

 

df['D'] = [10, 11, 12]
print(df)

#   A  B  C   D
#0  1  4  7  10
#1  2  5  8  11
#2  3  6  9  12

 

assign() 함수를 사용하여 새로운 열을 추가할 수 있습니다. 이 함수는 기존 DataFrame을 변경하지 않고 새로운 DataFrame을 반환합니다. 이 함수는 모든 행에 대해 같은 값을 가진 새로운 열을 생성하거나, 각 행에 대해 다른 값을 가진 새로운 열을 생성할 수 있습니다.

 

df = df.assign(E = [13, 14, 15])
print(df)

#   A  B  C   D   E
#0  1  4  7  10  13
#1  2  5  8  11  14
#2  3  6  9  12  15

 

insert() 함수를 사용하여 DaraFrame의 특정 위치에 새로운 열을 삽입할 수 있습니다. 이 함수는 원본 DataFrame을 직접 변경합니다. 코드에서 loc는 새로운 열을 삽입할 위치의 인덱스이고, new_column은 새로운 열의 이름이며, value는 새로운 열의 값입니다.

 

df.insert(2, 'F', [16, 17, 18])
print(df)

#   A  B   F  C   D   E
#0  1  4  16  7  10  13
#1  2  5  17  8  11  14
#2  3  6  18  9  12  15

 

열을 삭제하는 가장 일반적인 방법은 drop()함수를 사용하는 것입니다. drop()함수는 지정된 열을 제거한 새로운 DataFrame을 반환합니다. 원본 DataFrame을 변경하려면 inplace=True 옵션을 사용하거나 반환 값을 원래의 DataFrame에 다시 할당해야 합니다.

 

df = df.drop('D', axis=1)
print(df)

#   A  B   F  C   E
#0  1  4  16  7  13
#1  2  5  17  8  14
#2  3  6  18  9  15

 

또한 del 키워드를 사용하여 열을 삭제할 수도 있습니다. del 키워드는 원본 DataFrame에서 지정된 열을 바로 삭제합니다.

 

del df['E']
print(df)

#   A  B   F  C
#0  1  4  16  7
#1  2  5  17  8
#2  3  6  18  9