Pandas 기본 데이터 클리닝

PandasBeginner
지금 연습하기

소개

Pandas 기본 데이터 클리닝 실습에 오신 것을 환영합니다. 데이터 클리닝은 모든 데이터 분석 또는 머신러닝 프로젝트에서 매우 중요한 첫 단계입니다. 실제 데이터는 종종 누락된 값, 중복 항목 또는 잘못된 데이터 유형을 포함하여 지저분한 경우가 많습니다. 정리되지 않은 원시 데이터를 사용하면 부정확한 분석과 신뢰할 수 없는 결론으로 이어질 수 있습니다.

Pandas 는 고성능의 사용하기 쉬운 데이터 구조와 데이터 분석 도구를 제공하는 강력한 Python 라이브러리입니다. Python 에서 데이터 클리닝 및 조작을 위한 필수 도구입니다.

이 실습에서는 Pandas 를 사용하여 데이터셋을 클리닝하는 기본적인 기술을 배우게 됩니다. 다음을 연습하게 됩니다:

  • dropna()를 사용하여 누락된 값이 있는 행 삭제하기.
  • fillna()를 사용하여 누락된 값 채우기.
  • drop_duplicates()를 사용하여 중복 행 제거하기.
  • rename()을 사용하여 열 이름 변경하기.
  • astype()을 사용하여 열 데이터 유형 변환하기.

이 실습이 끝나면 Pandas 의 기본적인 데이터 클리닝 워크플로우에 대한 확실한 이해를 갖게 될 것입니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 88%입니다.학습자들로부터 100%의 긍정적인 리뷰율을 받았습니다.

dropna 메서드를 사용하여 행 삭제

이 단계에서는 null 값을 포함하는 행을 삭제하여 누락된 데이터를 처리하는 방법을 배우게 됩니다. Pandas 에서 누락된 데이터는 NaN (Not a Number) 으로 표현됩니다. NaN 값을 처리하는 가장 간단한 전략 중 하나는 해당 값을 포함하는 행 또는 열을 제거하는 것입니다.

dropna() 메서드를 사용하면 이 작업을 쉽게 수행할 수 있습니다. 기본적으로 이 메서드는 하나 이상의 NaN 값을 포함하는 모든 행을 제거합니다.

먼저, 시작 DataFrame 을 확인하기 위해 초기 스크립트를 실행해 보겠습니다. 설정 스크립트에서 이미 ~/project 디렉토리에 main.py라는 파일이 생성되었습니다.

WebIDE 에서 터미널을 열고 다음 명령을 실행합니다:

python3 main.py

agecity 열에 NaN 값이 포함된 원본 DataFrame 이 표시될 것입니다.

Original DataFrame:
      name   age         city SALARY_IN_USD
0    Alice  25.0     New York         50000
1      Bob  30.0  Los Angeles         60000
2  Charlie  35.0     New York         70000
3    David  40.0      Chicago         80000
4    Alice  25.0     New York         50000
5      Eva   NaN       Boston         90000
6    Frank  45.0          NaN        100000

Original DataFrame Info:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 7 entries, 0 to 6
Data columns (total 4 columns):
 ##   Column         Non-Null Count  Dtype
---  ------         --------------  -----
 0   name           7 non-null      object
 1   age            6 non-null      float64
 2   city           6 non-null      object
 3   SALARY_IN_USD  7 non-null      object
dtypes: float64(1), object(3)
memory usage: 352.0+ bytes

이제 dropna()를 사용하여 작동 방식을 살펴보겠습니다. 왼쪽 패널의 파일 탐색기에서 main.py 파일을 엽니다. 파일 끝에 다음 코드를 추가합니다. 이 코드는 NaN 행이 제거된 새 DataFrame df_dropped를 생성하고 이를 출력합니다. 아직 원본 df를 수정하지 않았으므로 다음 단계에서 다른 메서드를 탐색할 수 있습니다.

## Add this to the end of main.py

print("\nDataFrame after dropping rows with any missing values:")
df_dropped = df.dropna()
print(df_dropped)

파일을 저장 (Ctrl+S 또는 Cmd+S) 하고 터미널에서 다시 실행합니다:

python3 main.py

출력에는 이제 NaN 값이 있는 행 (Eva 및 Frank 의 행) 이 제거된 후의 DataFrame 을 보여주는 새 섹션이 포함됩니다.

## ... (previous output) ...

DataFrame after dropping rows with any missing values:
      name   age         city SALARY_IN_USD
0    Alice  25.0     New York         50000
1      Bob  30.0  Los Angeles         60000
2  Charlie  35.0     New York         70000
3    David  40.0      Chicago         80000
4    Alice  25.0     New York         50000

fillna 를 사용하여 누락된 값 채우기

이 단계에서는 누락된 데이터를 처리하는 또 다른 방법, 즉 fillna() 메서드를 사용하여 누락된 값을 특정 값으로 채우는 방법을 배우게 됩니다. 누락된 데이터가 있는 행을 삭제하면 때때로 상당한 데이터 손실이 발생할 수 있으며, 특히 많은 행에 누락된 값이 있는 경우 더욱 그렇습니다. 누락된 값을 채우는 것이 종종 더 나은 대안이 됩니다.

NaN 값을 0 또는 "Unknown"과 같은 상수 값으로 채우거나, 해당 열의 평균 또는 중앙값과 같은 계산된 값으로 채울 수 있습니다.

main.py 파일을 수정해 보겠습니다. 마지막 단계에서 추가한 dropna() 코드를 삭제하고 대신 다음 코드를 사용하여 누락된 값을 채워 기본 DataFrame df를 정리합니다. 누락된 age는 기존 나이의 평균으로 채우고, 누락된 city는 'Unknown' 문자열로 채울 것입니다.

마지막 단계에서 추가한 dropna() 코드를 제거하고 다음 코드로 대체합니다. inplace=True를 사용하여 DataFrame 을 직접 수정합니다.

## Replace the dropna() code with this at the end of main.py

## Calculate the mean of the 'age' column
mean_age = df['age'].mean()

## Fill missing values using the recommended approach to avoid FutureWarnings
df.fillna({'age': mean_age, 'city': 'Unknown'}, inplace=True)

print("\nDataFrame after filling missing values:")
print(df)

inplace=True 인수는 DataFrame 을 제자리에서 수정합니다. 즉, 결과를 변수에 다시 할당할 필요가 없습니다 (예: df = df.fillna(...)).

파일을 저장하고 터미널에서 실행합니다:

python3 main.py

NaN 값이 대체된 것을 볼 수 있습니다. Eva 의 나이는 이제 다른 나이의 평균으로 채워지고, Frank 의 도시는 'Unknown'으로 채워집니다.

## ... (original DataFrame output) ...

DataFrame after filling missing values:
      name   age         city SALARY_IN_USD
0    Alice  25.0     New York         50000
1      Bob  30.0  Los Angeles         60000
2  Charlie  35.0     New York         70000
3    David  40.0      Chicago         80000
4    Alice  25.0     New York         50000
5      Eva  33.3       Boston         90000
6    Frank  45.0      Unknown        100000

참고: 평균 나이는 (25+30+35+40+25+45)/6 = 33.33...입니다. Pandas 는 이 값으로 NaN을 채웁니다. 위의 출력은 단순화를 위해 35.0을 표시하지만, Eva 의 나이에 대한 실제 출력은 계산된 평균이 될 것입니다.

drop_duplicates 를 사용하여 중복 행 삭제

이 단계에서는 DataFrame 에서 중복 행을 제거하는 방법을 배우게 됩니다. 중복 데이터는 분석을 왜곡하고 잘못된 결과로 이어질 수 있습니다. drop_duplicates() 메서드는 이를 식별하고 제거하는 데 도움이 됩니다.

원본 데이터셋에서 'Alice'에 대한 행이 정확히 동일한 정보로 두 번 나타납니다. 누락된 값을 처리했으므로, 다음 정리 작업은 이 중복 항목을 제거하는 것입니다.

기본적으로 drop_duplicates()는 한 행의 모든 열 값이 다른 행의 값과 동일한 경우 해당 행을 중복으로 간주합니다.

main.py 스크립트 끝에 다음 코드를 추가합니다. DataFrame 을 수정하기 위해 계속해서 inplace=True를 사용합니다.

## Add this to the end of main.py

df.drop_duplicates(inplace=True)

print("\nDataFrame after dropping duplicates:")
print(df)

파일을 저장하고 터미널에서 실행합니다:

python3 main.py

출력에는 이제 'Alice' 행 중 하나가 제거되었으므로 6 개의 행만 표시됩니다.

## ... (previous output) ...

DataFrame after dropping duplicates:
      name   age         city SALARY_IN_USD
0    Alice  25.0     New York         50000
1      Bob  30.0  Los Angeles         60000
2  Charlie  35.0     New York         70000
3    David  40.0      Chicago         80000
5      Eva  33.3       Boston         90000
6    Frank  45.0      Unknown        100000

인덱스 4가 이제 누락되었으며, 이는 삭제된 중복 행에 해당합니다. DataFrame 에는 이제 6 개의 고유한 행이 있습니다.

rename 메서드를 사용하여 열 이름 변경

이 단계에서는 열 이름을 변경하는 방법을 배우게 됩니다. 일관되고 명확한 열 이름은 코드 가독성과 유지보수성에 필수적입니다. 모든 소문자와 밑줄을 사용하는 것과 같이 일관된 명명 규칙을 사용하는 것이 일반적인 관행입니다.

우리 DataFrame 에는 SALARY_IN_USD라는 열이 있습니다. 이를 더 간단한 소문자 이름인 salary로 변경해 보겠습니다. rename() 메서드가 이를 위해 완벽합니다. columns 인수에 딕셔너리를 전달하는데, 여기서 키는 이전 이름이고 값은 새 이름입니다.

main.py 스크립트 끝에 다음 코드를 추가합니다:

## Add this to the end of main.py

df.rename(columns={'SALARY_IN_USD': 'salary'}, inplace=True)

print("\nDataFrame after renaming columns:")
print(df)

파일을 저장하고 터미널에서 실행합니다:

python3 main.py

SALARY_IN_USD 열이 성공적으로 salary로 이름이 변경된 것을 볼 수 있습니다.

## ... (previous output) ...

DataFrame after renaming columns:
      name   age         city   salary
0    Alice  25.0     New York    50000
1      Bob  30.0  Los Angeles    60000
2  Charlie  35.0     New York    70000
3    David  40.0      Chicago    80000
5      Eva  33.3       Boston    90000
6    Frank  45.0      Unknown   100000

이 간단한 변경으로 열 이름을 입력하기 쉬워지고 일반적인 Python 스타일 가이드를 따르게 됩니다.

astype 를 사용하여 열 유형 변환

이 마지막 단계에서는 열의 데이터 타입을 변환하는 방법을 배우게 됩니다. 올바른 데이터 타입은 계산 수행과 메모리 효율성에 매우 중요합니다.

초기 df.info() 출력에서 SALARY_IN_USD 열의 Dtype 이 object였음을 알 수 있습니다. 이는 숫자를 문자열로 저장하고 있었음을 의미합니다. 문자열에 대해서는 수학적 연산 (예: 평균 급여 계산) 을 수행할 수 없습니다. 이 열을 int (정수) 와 같은 숫자 타입으로 변환해야 합니다.

astype() 메서드가 이 목적으로 사용됩니다. 이제 새 salary 열을 int 타입으로 변환해 보겠습니다.

main.py 끝에 다음 코드를 추가합니다. 변경 사항을 확인하기 위해 DataFrame 의 info 를 다시 출력할 것입니다.

## Add this to the end of main.py

df['salary'] = df['salary'].astype(int)

print("\nDataFrame after converting data types:")
print(df)

print("\nFinal DataFrame Info:")
df.info()

파일을 저장하고 마지막으로 실행합니다:

python3 main.py

최종 출력에는 정리된 DataFrame 과 새로운 정보가 표시됩니다. info 출력에서 salary 열의 Dtype을 자세히 살펴보세요. 이제 object가 아닌 int64여야 합니다.

## ... (previous output) ...

DataFrame after converting data types:
      name   age         city  salary
0    Alice  25.0     New York   50000
1      Bob  30.0  Los Angeles   60000
2  Charlie  35.0     New York   70000
3    David  40.0      Chicago   80000
5      Eva  33.3       Boston   90000
6    Frank  45.0      Unknown  100000

Final DataFrame Info:
<class 'pandas.core.frame.DataFrame'>
Index: 6 entries, 0 to 6
Data columns (total 4 columns):
 ##   Column  Non-Null Count  Dtype
---  ------  --------------  -----
 0   name    6 non-null      object
 1   age     6 non-null      float64
 2   city    6 non-null      object
 3   salary  6 non-null      int64
dtypes: float64(1), int64(1), object(2)
memory usage: 240.0+ bytes

salary 열이 정수 타입이 되었으므로 이제 df['salary'].mean()과 같은 계산을 수행할 수 있습니다.

요약

Pandas 기본 데이터 클리닝 실습을 완료하신 것을 축하드립니다! 지저분하고 원시적인 데이터셋을 분석 준비가 된 깨끗한 형식으로 성공적으로 변환했습니다.

이 실습에서는 Pandas 의 몇 가지 필수적인 데이터 클리닝 기법을 배우고 연습했습니다:

  • 결측값 처리: dropna()를 사용하여 NaN이 있는 행을 제거하는 방법과 fillna()를 사용하여 의미 있는 데이터로 채우는 방법을 배웠습니다.
  • 중복 제거: drop_duplicates()를 사용하여 데이터셋에서 불필요한 행을 제거했습니다.
  • 열 이름 변경: rename() 메서드를 사용하여 열 이름을 더 일관되고 읽기 쉽게 만드는 방법을 배웠습니다.
  • 데이터 타입 변환: astype()을 사용하여 열의 데이터 타입을 올바른 형식으로 변경하여 추가 분석을 가능하게 했습니다.

이러한 기본적인 기술은 모든 진지한 데이터 작업의 기초입니다. 이를 숙달하면 실제 데이터 문제를 자신 있게 해결할 수 있습니다. Pandas 를 사용한 데이터 조작에 능숙해지기 위해 이러한 기술을 계속 연습하십시오.