빅데이터 김교수의 "AI노마드연구소" AI로 열어가는 노마드 세상!

빅데이터 김교수의 "AI노마드연구소" AI로 열어가는 노마드 세상입니다. AI 코딩작성, SNS 분석, AI업무자동화 컨설팅 0507-1419-0222

자세히보기

교육/파이썬빅데이터분석교육

파이썬 판다스의 이해2 - Pandas Cleaning

빅데이터 김교수 2022. 12. 8. 14:24

Pandas - 빈 셀 청소

 

빈 셀

빈 셀은 데이터를 분석할 때 잠재적으로 잘못된 결과를 제공할 수 있습니다.


행 제거

빈 셀을 처리하는 한 가지 방법은 빈 셀이 포함된 행을 제거하는 것입니다.

데이터 세트가 매우 클 수 있고 몇 개의 행을 제거해도 결과에 큰 영향을 미치지 않기 때문에 일반적으로 괜찮습니다.

예시

빈 셀이 없는 새 데이터 프레임을 반환합니다.

import pandas as pd

df = pd.read_csv('data.csv')

new_df = df.dropna()

print(new_df.to_string())

참고: 기본적으로 dropna()메서드는  DataFrame을 반환하고 원본을 변경하지 않습니다.

원래 DataFrame을 변경하려면 다음 inplace = True인수 를 사용하십시오.

예시

NULL 값이 있는 모든 행을 제거합니다.

import pandas as pd

df = pd.read_csv('data.csv')

df.dropna(inplace = True)

print(df.to_string())

참고: 이제 dropna(inplace = True)는 새 DataFrame을 반환하지 않지만 원래 DataFrame에서 NULL 값을 포함하는 모든 행을 제거합니다.


빈 값 바꾸기

빈 셀을 처리하는 또 다른 방법은 대신  값을 삽입하는 것입니다.

이렇게 하면 일부 빈 셀 때문에 전체 행을 삭제할 필요가 없습니다.

 fillna()메서드를 사용하면 빈 셀을 값으로 바꿀 수 있습니다.

예시

NULL 값을 숫자 130으로 바꿉니다.

import pandas as pd

df = pd.read_csv('data.csv')

df.fillna(130, inplace = True)
 
 
지정된 열에 대해서만 바꾸기
 
 

위의 예는 전체 데이터 프레임의 모든 빈 셀을 대체합니다.

한 열의 빈 값만 바꾸려면 DataFrame 의 열 이름 을 지정합니다.

예시

"칼로리" 열의 NULL 값을 숫자 130으로 바꿉니다.

 

import pandas as pd

df = pd.read_csv('data.csv')

df["Calories"].fillna(130, inplace = True)

 평균, 중앙값 또는 최빈값을 사용하여 바꾸기

빈 셀을 대체하는 일반적인 방법은 열의 평균, 중앙값 또는 최빈값을 계산하는 것입니다.

Pandas는 mean() median()및 mode()메서드를 사용하여 지정된 열에 대한 각각의 값을 계산합니다.

예시

MEAN을 계산하고 비어 있는 값을 모두 다음으로 바꿉니다.

 
 
import pandas as pd

df = pd.read_csv('data.csv')

x = df["Calories"].mean()

df["Calories"].fillna(x, inplace = True)

Mean = 평균값(모든 값의 합계를 값의 수로 나눈 값).

예시

MEDIAN을 계산하고 빈 값을 모두 다음과 같이 바꿉니다.

import pandas as pd

df = pd.read_csv('data.csv')

x = df["Calories"].median()
 
df["Calories"].fillna(x, inplace = True)

 

중앙값 = 모든 값을 오름차순으로 정렬한 후 중간에 있는 값입니다.

예시

MODE를 계산하고 빈 값을 모두 다음과 같이 바꿉니다.

 
import pandas as pd

df = pd.read_csv('data.csv')

x = df["Calories"].mode()[0]

df["Calories"].fillna(x, inplace = True)

모드 = 가장 자주 나타나는 값. 

 

Pandas - 잘못된 형식의 데이터 정리

 

잘못된 형식의 데이터

잘못된 형식의 데이터가 포함된 셀은 데이터 분석을 어렵게 만들거나 불가능하게 만들 수 있습니다.

이를 수정하려면 행을 제거하거나 열의 모든 셀을 동일한 형식으로 변환하는 두 가지 옵션이 있습니다.


올바른 형식으로 변환

데이터 프레임에는 형식이 잘못된 두 개의 셀이 있습니다. 행 22와 26을 확인하십시오. 'Date' 열은 날짜를 나타내는 문자열이어야 합니다.

      기간 날짜 맥박 Maxpulse 칼로리
  0 60 '2020/12/01' 110 130 409.1
  1 60 '2020/12/02' 117 145 479.0
  2 60 '2020/12/03' 103 135 340.0
  3 45 '2020/12/04' 109 175 282.4
  4 45 '2020/12/05' 117 148 406.0
  5 60 '2020/12/06' 102 127 300.0
  6 60 '2020/12/07' 110 136 374.0
  7 450 '2020/12/08' 104 134 253.3
  8 30 '2020/12/09' 109 133 195.1
  9 60 '2020/12/10' 98 124 269.0
  10 60 '2020/12/11' 103 147 329.3
  11 60 '2020/12/12' 100 120 250.7
  12 60 '2020/12/12' 100 120 250.7
  13 60 '2020/12/13' 106 128 345.3
  14 60 '2020/12/14' 104 132 379.3
  15 60 '2020/12/15' 98 123 275.0
  16 60 '2020/12/16' 98 120 215.2
  17 60 '2020/12/17' 100 120 300.0
  18 45 '2020/12/18' 90 112 NaN
  19 60 '2020/12/19' 103 123 323.0
  20 45 '2020/12/20' 97 125 243.0
  21 60 '2020/12/21' 108 131 364.2 
  22 45 NaN 100 119 282.0
  23 60 '2020/12/23' 130 101 300.0
  24 45 '2020/12/24' 105 132 246.0
  25 60 '2020/12/25' 102 126 334.5 
  26 60 20201226 100 120 250.0
  27 60 '2020/12/27' 92 118 241.0
  28 60 '2020/12/28' 103 132 NaN
  29 60 '2020/12/29' 100 132 280.0
  30 60 '2020/12/30' 102 129 380.3
  31 60 '2020/12/31' 92 115 243.0

'날짜' 열의 모든 셀을 날짜로 변환해 보겠습니다.

Pandas에는 다음과 같은 to_datetime()방법이 있습니다.

예시

날짜로 변환:

import pandas as pd

df = pd.read_csv('data.csv')

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

print(df.to_string())
 
  결과:
      기간 날짜 맥박 Maxpulse 칼로리
  0 60 '2020/12/01' 110 130 409.1
  1 60 '2020/12/02' 117 145 479.0
  2 60 '2020/12/03' 103 135 340.0
  3 45 '2020/12/04' 109 175 282.4
  4 45 '2020/12/05' 117 148 406.0
  5 60 '2020/12/06' 102 127 300.0
  6 60 '2020/12/07' 110 136 374.0
  7 450 '2020/12/08' 104 134 253.3
  8 30 '2020/12/09' 109 133 195.1
  9 60 '2020/12/10' 98 124 269.0
  10 60 '2020/12/11' 103 147 329.3
  11 60 '2020/12/12' 100 120 250.7
  12 60 '2020/12/12' 100 120 250.7
  13 60 '2020/12/13' 106 128 345.3
  14 60 '2020/12/14' 104 132 379.3
  15 60 '2020/12/15' 98 123 275.0
  16 60 '2020/12/16' 98 120 215.2
  17 60 '2020/12/17' 100 120 300.0
  18 45 '2020/12/18' 90 112 NaN
  19 60 '2020/12/19' 103 123 323.0
  20 45 '2020/12/20' 97 125 243.0
  21 60 '2020/12/21' 108 131 364.2 
  22 45 나트 100 119 282.0
  23 60 '2020/12/23' 130 101 300.0
  24 45 '2020/12/24' 105 132 246.0
  25 60 '2020/12/25' 102 126 334.5 
  26 60 '2020/12/26' 100 120 250.0
  27 60 '2020/12/27' 92 118 241.0
  28 60 '2020/12/28' 103 132 NaN
  29 60 '2020/12/29' 100 132 280.0
  30 60 '2020/12/30' 102 129 380.3
  31 60 '2020/12/31' 92 115 243.0

결과에서 알 수 있듯이 26행의 날짜는 고정되었지만 22행의 빈 날짜는 NaT(Not a Time) 값, 즉 빈 값을 얻었습니다. 빈 값을 처리하는 한 가지 방법은 단순히 전체 행을 제거하는 것입니다.

 

행 제거

dropna()위 예제에서 변환한 결과는 NaT 값을 주었는데, 이 값은 NULL 값으로 처리할 수 있으며, 메서드 를 사용하여 행을 제거할 수 있습니다 .

예시

"Date" 열에서 NULL 값이 있는 행을 제거합니다.

df.dropna(subset=['Date'], inplace = True
 

Pandas - 잘못된 데이터 수정


잘못된 데이터

"잘못된 데이터"는 "빈 셀" 또는 "잘못된 형식"일 필요가 없습니다. 누군가가 "1.99" 대신 "199"를 등록한 경우와 같이 잘못되었을 수 있습니다.

때로는 데이터 세트를 살펴봄으로써 잘못된 데이터를 발견할 수 있습니다.

데이터 세트를 살펴보면 7행에서 기간이 450이지만 다른 모든 행의 기간은 30에서 60 사이임을 알 수 있습니다.

틀릴 필요는 없지만 이것이 누군가의 운동 세션 데이터 세트라는 점을 고려하면 이 사람이 450분 동안 운동하지 않았다는 사실로 결론을 내립니다.

      기간 날짜 맥박 Maxpulse 칼로리
  0 60 '2020/12/01' 110 130 409.1
  1 60 '2020/12/02' 117 145 479.0
  2 60 '2020/12/03' 103 135 340.0
  3 45 '2020/12/04' 109 175 282.4
  4 45 '2020/12/05' 117 148 406.0
  5 60 '2020/12/06' 102 127 300.0
  6 60 '2020/12/07' 110 136 374.0 
  7 450 '2020/12/08' 104 134 253.3
  8 30 '2020/12/09' 109 133 195.1
  9 60 '2020/12/10' 98 124 269.0
  10 60 '2020/12/11' 103 147 329.3
  11 60 '2020/12/12' 100 120 250.7
  12 60 '2020/12/12' 100 120 250.7
  13 60 '2020/12/13' 106 128 345.3
  14 60 '2020/12/14' 104 132 379.3
  15 60 '2020/12/15' 98 123 275.0
  16 60 '2020/12/16' 98 120 215.2
  17 60 '2020/12/17' 100 120 300.0
  18 45 '2020/12/18' 90 112 NaN
  19 60 '2020/12/19' 103 123 323.0
  20 45 '2020/12/20' 97 125 243.0
  21 60 '2020/12/21' 108 131 364.2
  22 45 NaN 100 119 282.0
  23 60 '2020/12/23' 130 101 300.0
  24 45 '2020/12/24' 105 132 246.0
  25 60 '2020/12/25' 102 126 334.5
  26 60 20201226 100 120 250.0
  27 60 '2020/12/27' 92 118 241.0
  28 60 '2020/12/28' 103 132 NaN
  29 60 '2020/12/29' 100 132 280.0
  30 60 '2020/12/30' 102 129 380.3
  31 60 '2020/12/31' 92 115 243.0

행 7의 "기간"과 같은 잘못된 값을 수정하려면 어떻게 해야 합니까?

값 바꾸기

잘못된 값을 수정하는 한 가지 방법은 값을 다른 값으로 바꾸는 것입니다.

이 예에서는 오타일 가능성이 높으며 값은 "450"이 아니라 "45"여야 하며 행 7에 "45"를 삽입할 수 있습니다.

예시

7행에서 "기간" = 45로 설정:

df.loc[7, 'Duration'] = 45

작은 데이터 세트의 경우 잘못된 데이터를 하나씩 교체할 수 있지만 큰 데이터 세트의 경우에는 그렇지 않습니다.

더 큰 데이터 세트의 잘못된 데이터를 바꾸려면 몇 가지 규칙을 만들 수 있습니다. 예를 들어 유효한 값에 대한 일부 경계를 설정하고 경계 외부에 있는 모든 값을 바꿉니다.

예시

"기간" 열의 모든 값을 반복합니다.

값이 120보다 크면 120으로 설정합니다.

 
for x in df.index:
  if df.loc[x, "Duration"] > 120:
    df.loc[x, "Duration"] = 120

행 제거

잘못된 데이터를 처리하는 또 다른 방법은 잘못된 데이터가 포함된 행을 제거하는 것입니다.

이렇게 하면 대체할 항목을 찾을 필요가 없으며 분석을 수행하는 데 필요하지 않을 가능성이 높습니다.

예시

"Duration"이 120보다 큰 행을 삭제합니다.

for x in df.index:
  if df.loc[x, "Duration"] > 120:
    df.drop(x, inplace = True)

Pandas - 중복 제거

 

중복 검색

중복 행은 두 번 이상 등록된 행입니다.

      기간 날짜 맥박 Maxpulse 칼로리
  0 60 '2020/12/01' 110 130 409.1
  1 60 '2020/12/02' 117 145 479.0
  2 60 '2020/12/03' 103 135 340.0
  3 45 '2020/12/04' 109 175 282.4
  4 45 '2020/12/05' 117 148 406.0
  5 60 '2020/12/06' 102 127 300.0
  6 60 '2020/12/07' 110 136 374.0
  7 450 '2020/12/08' 104 134 253.3
  8 30 '2020/12/09' 109 133 195.1
  9 60 '2020/12/10' 98 124 269.0
  10 60 '2020/12/11' 103 147 329.3
  11 60 '2020/12/12' 100 120 250.7
  12 60 '2020/12/12' 100 120 250.7
  13 60 '2020/12/13' 106 128 345.3
  14 60 '2020/12/14' 104 132 379.3
  15 60 '2020/12/15' 98 123 275.0
  16 60 '2020/12/16' 98 120 215.2
  17 60 '2020/12/17' 100 120 300.0
  18 45 '2020/12/18' 90 112 NaN
  19 60 '2020/12/19' 103 123 323.0
  20 45 '2020/12/20' 97 125 243.0
  21 60 '2020/12/21' 108 131 364.2
  22 45 NaN 100 119 282.0
  23 60 '2020/12/23' 130 101 300.0
  24 45 '2020/12/24' 105 132 246.0
  25 60 '2020/12/25' 102 126 334.5
  26 60 20201226 100 120 250.0
  27 60 '2020/12/27' 92 118 241.0
  28 60 '2020/12/28' 103 132 NaN
  29 60 '2020/12/29' 100 132 280.0
  30 60 '2020/12/30' 102 129 380.3
  31 60 '2020/12/31' 92 115 243.0

테스트 데이터 세트를 살펴보면 행 11과 12가 중복되어 있다고 가정할 수 있습니다.

중복을 발견하기 위해 이 duplicated()방법을 사용할 수 있습니다.

 duplicated()메서드는 각 행에 대한 부울 값을 반환합니다.

예시

True그렇지 않으면 중복된 모든 행을 반환 합니다 False.

print(df.duplicated())

 

중복 제거

중복을 제거하려면 drop_duplicates()방법을 사용하십시오.

예시

모든 중복 제거:

df.drop_duplicates(inplace = True)

 기억하세요: 는 메서드가 새(inplace = True) DataFrame을 반환하지 않도록 하지만 원본 DataFrame 에서 모든 중복 항목을 제거합니다 .

Pandas - 데이터 상관 관계

 

관계 찾기

Pandas 모듈의 훌륭한 측면은 corr()방법입니다.

 corr()방법은 데이터 세트의 각 열 간의 관계를 계산합니다.

이 페이지의 예에서는 'data.csv'라는 CSV 파일을 사용합니다.

data.csv를 다운로드 합니다. 또는 data.csv 열기

예시

열 간의 관계를 표시합니다.

df.corr()

결과

            기간 맥박 Maxpulse 칼로리
  기간 1.000000 -0.155408 0.009403 0.922721
  펄스 -0.155408 1.000000 0.786535 0.025120
  맥스펄스 0.009403 0.786535 1.000000 0.203814
  칼로리 0.922721 0.025120 0.203814 1.000000

참고:  corr()방법은 "숫자가 아님" 열을 무시합니다.

결과 설명

메서드 의 결과는 corr()두 열 간의 관계가 얼마나 좋은지를 나타내는 많은 숫자가 포함된 테이블입니다.

숫자는 -1에서 1까지 다양합니다.

1은 1:1 관계(완벽한 상관관계)가 있음을 의미하며, 이 데이터 세트의 경우 첫 번째 열의 값이 올라갈 때마다 다른 값도 올라갔습니다.

0.9도 좋은 관계이고, 하나의 값을 높이면 다른 하나도 아마 증가할 것입니다.

-0.9는 0.9만큼 좋은 관계이지만, 하나의 값을 높이면 다른 하나는 아마도 낮아질 것입니다.

0.2는 좋은 관계가 아님을 의미합니다. 즉, 한 값이 올라간다고 다른 값이 올라가는 것은 아닙니다.

좋은 상관관계란? 용도에 따라 다르지만 좋은 상관관계라고 부르기 위해서는 최소한 0.6(혹은 )은 있어야 한다고 말하는 것이 안전하다고 생각합니다.-0.6

완벽한 상관 관계:

"Duration"과 "Duration"에 숫자가 붙는 것을 볼 수 있습니다 1.000000. 각 열은 항상 자체적으로 완벽한 관계를 가집니다.

좋은 상관 관계:

"기간"과 "칼로리"는 0.922721상관관계가 있습니다. 이것은 매우 좋은 상관관계입니다. 우리는 운동을 오래할수록 더 많은 칼로리를 태우고 그 반대도 마찬가지라고 예측할 수 있습니다. 아마도 오랫동안 운동을했을 것입니다.

나쁜 상관 관계:

"Duration"과 "Maxpulse"는 0.009403상관관계가 있습니다. 이는 매우 나쁜 상관관계입니다. 즉, 운동 시간만 보고 최대 맥박을 예측할 수 없으며 그 반대의 경우도 마찬가지입니다.