본문 바로가기
데이터분석/판다스

08. apply, map, 산술연산, 원 핫 코딩

by 사라리24 2024. 5. 24.
SMALL

 

1. apply 사용하기

 

  • Series나 DataFrame에 구체적인 로직을 적용하고 싶을때 사용
  • apply를 적용하기 위해 별도의 함숙가 먼저 정의되야 함
  • 작성된 함수를 apply에 매개변수로 전달함

 

  • 데이터 확인

  
          df.head()
 
 
 

 

  • 문자열의 성별정보를 숫자로 변환하기

  
           # 성별이 남자는 1, 여자는 0으로 변환(loc를 사용)
          df.loc[df['gender'] == '남자', 'gender'] = 1
          df.loc[df['gender'] == '여자', 'gender'] = 0
 
          df.head()

 

 

  • 데이터 다시 담기 
 
 
          df = pd.read_csv('/content/drive/MyDrive/1. KDT/5. 데이터 분석/데이터/idol.csv')
          df.head()
 
       


df에 첫파일을 다시 담기

 

  • 자열의 성별정보를 숫자로 변환하는 함수를 만들기
  
 
        # 문자열 성별 정보를 숫자로 변환하는 함수
        # '성별' 열의 각 값이 함수에 전달 ('남자'를 1로 / '여자'를 0으로 변환 )
 
 
            def male_or_female(x):
              if x == '남자' :
                return 1
              elif x == '여자':
                return 0
              else:
                return None
 
 
          """
          인자:
          x (str): 성별 정보 ('남자' 또는 '여자')
         
          반환값:
          int: '남자'이면 1, '여자'이면 0
          None:
 
         # df의 '성별' 열에 대해 male_or_female 함수를 적용
            df['성별'].apply(male_or_female)
 
  
         # 람다 함수로 표현
            df['성별'].apply(lambda x:1 if x=='남자' else 0)
 
 
            # 파생변수 만들기
            df['New성별']=df['성별'].apply(lambda x:1 if x=='남자' else 0)
            df.head()

 





 

2.  map 사용하기

 

  • 딕셔너리를 통해 데이터와 같은 키의 값을 적용

 

  • 원본 데이터 다시 받기
  
 
 
          df = pd.read_csv('/content/drive/MyDrive/1. KDT/5. 데이터 분석/데이터/idol.csv')
          df.head()
 
  
 

 

  • 원본 데이터 다시 받기
  
 
 
 
          # 성별 정보를 숫자로 매핑하기 위한 사전 정의
          map_gender = {'남자':1, '여자':0}
  
          # df의 '성별' 열에 대해 map_gender 사전을 사용하여 성별을 숫자로 변환
          # '성별' 열의 각 값이 사전의 키('남자' 또는 '여자')에 따라 1 또는 0으로 매핑
          df['성별'].map(map_gender)
 
 
 

 

 

  • 데이터프레임의 산술연산
    : 행의 개수가 다른 경우 빠진 데이터를 NaN으로 취급하기 문에 연산이 안됨


 
            # DataFrame을 생성 : 3 열 5행
            df = pd.DataFrame({
                '파이썬' : [60, 70, 80, 86, 95],
                '데이터분석' : [40, 60, 70, 55, 87],
                '머신러닝딥러닝' : [60, 70, 80, 86, 95]
            })

            # DataFrame을 출력
            df

            # '파이썬' 열의 데이터 타입을 확인
            df['파이썬'].dtypes

            # '파이썬' 열의 데이터 타입을 확인합니다. 결과는 'Series' 타입입니다.
            type(df['파이썬'])
 
 






 

  •  '파이썬', '데이터분석', '머신러닝딥러닝' 열의 값을 모두 더하기
  
 
            # '파이썬', '데이터분석', '머신러닝딥러닝' 열의 값을 모두 더합니다.
            df['파이썬'] + df['데이터분석'] + df['머신러닝딥러닝']
  
 

 

 

  •  df에 총점, 평균이라는 파생변수를 만들고 총점, 평균을 구해서 저장
 
 
 
        # df에 총점, 평균이라는 파생변수를 만들고 파생변수에 총점, 평균을 구해서 저장
        df['총점'] = df['파이썬'] + df['데이터분석'] + df['머신러닝딥러닝']
        df['평균'] = df['총점'] / 3
        df
 
  

 

  •  
 
 
 
          # df의 '파이썬' 열의 모든 값을 더한 합계를 반환
          df['파이썬'].sum() # df['파이썬'].sum(axis=0)
 
          # df의 '파이썬' 열의 모든 값의 평균을 반환
          df['파이썬'].mean()
 
          # df의 모든 열에 대해 각 열의 합계를 계산하여 반환
          # 각 열의 합계는 열의 모든 값을 더한 값
          df.sum()
 
          #df의 모든 열에 대해 각 열의 평균을 계산하여 반환
          # 각 열의 평균은 열의 모든 값의 평균입니다.
          df.mean()
 
  


 

 



  
 
 
            # DataFrame을 생성 
            df1 = pd.DataFrame({
                '파이썬' : [60, 70, 80, 86, 95],
                '데이터분석' : [40, 60, 70, 55, 87],
                '머신러닝딥러닝' : [60, 70, 80, 86, 95]
            })
            df2 = pd.DataFrame({
                '파이썬' : ['D','C', 'B', 'B', 'A'],
                '데이터분석' : [40, 60, 70, 55, 87],
                '머신러닝딥러닝' : [60, 70, 80, 86, 95]
            })
  
           df1 + df2 #에러
 
           df1 + 10
 
           df2 + 10 #에러
 





 

 

  •  
 
 
 
            #  새로운 DataFrame을 생성 
          df1 = pd.DataFrame({
              '데이터분석':[40, 60, 70, 55, 87],
              '머신러닝딥러닝':[35, 40, 30, 80, 55]
          })

          df2 = pd.DataFrame({
              '데이터분석':[40, 60, 70, 55],
              '머신러닝딥러닝':[35, 40, 30, 80]
          })
 
 
 
        # 행의 개수가 다를 경우 빠진 데이터를 NaN으로 취급하기 때문에 연산이 안됨
        df1 + df2
 
 
 



 

 

3. select_dtypes

  

 

  • 원본 데이터 다시 가져오기
 
 
        df = pd.read_csv('/content/drive/MyDrive/1. KDT/5. 데이터 분석/데이터/idol.csv')
        df.head()
 
  

 

  • 데이터 프레임 정보보기
 
 
        df.info()
 
 

 

 

  • select_dtypes
 
 

          df.select_dtypes(include='object')
          # 문자열 컬럼만 가져오기

          df.select_dtypes(exclude='object')
          # 문자열 컬럼만 뺴고 가져오기
 
 
 
  

 

 

  • 문제: 문자열을 가지고 있는 컬럼의 이름만 저장하여 출력
 
 
 
          str_cols = df.select_dtypes(include='object').columns
          str_cols
 
 
 
          df[str_cols]
 
 

 

4. 원 핫 인코딩

  

 

  • 원 핫 인코딩(One Hot Encoding)
    : 한개의 요소는 1이고,  나머지 요소는 0으로 만들어서 카테고리형을 표현하는 방법
( 예시 )

df['형액형'] 
* 머신러닝/딥러닝 알고리즘에 널어 데이터를 예측하려고 하다면 라벨 인코딩을 하여 수치 데이터로 변환

* 컴퓨터는 값들 간의 관계를 스스로 형성하게 됨

* 만약 B형 -> 1, AB형은 2라는 값을 가지고 있을 때,

  컴퓨터는 'B형 + AB형 = 0형'라는 이상한 관계를 맺을 수도 있음
  이때, 서로의 관계를 끊어주는게 원핫인코딩


 해결방법(원핫인코딩): 
   column들을 분할해주고 
   1개의 column에는 1, 
   나머지 column에는 0으로 넣어줌으로 
   'A, B, AB, O형의 관계는 서로 독립적이다'라는 카테고리로 표현해주는 방식을 사용

 

  • 혈액형 정보를 숫자로 매핑
  
 
 
            # 혈액형 정보를 숫자로 매핑하기 위한 사전 정의
            blood_map = {'A':0, 'B':1, 'AB':2, 'O':3}

            # 데이터프레임 df의 '혈액형' 열에 대해 blood_map 사전을 사용하여 혈액형을 숫자로 변환
            # '혈액형' 열의 각 값이 사전의 키('A', 'B', 'AB', 'O')에 따라 0, 1, 2, 3으로 매핑
            df['혈액형_code'] = df['혈액형'].map(blood_map) # 라벨 인코딩
            df.head()
 
  
 

 

 

  • pd.get_dummies(): 원 핫 인코딩 적용
  
 
 
 
            # get_dummies(): 원 핫 인코딩을 적용
            pd.get_dummies(df['혈액형_code'])
 
  
 

 

  • 고유 값에 대해 새로운 이진 열
    ('혈액형_code_0', '혈액형_code_1', '혈액형_code_2', '혈액형_code_3')을 생성
  
 
            # 데이터프레임 df에서 '혈액형_code' 열에 대해 원-핫 인코딩을 적용
            # pd.get_dummies 함수는 지정된 열의 각 고유 값에 대해 새로운 이진 열을 생성
            # 원-핫 인코딩이 적용된 열은 '혈액형_code_0', '혈액형_code_1', '혈액형_code_2', '혈액형_code_3' 형식의 열로 변환

            df = pd.get_dummies(df, columns=['혈액형_code'])
            df
 
  
 

 

 

  • 데이터 테이블 확인
  
 
               df.info()
  
 

 

'데이터분석 > 판다스' 카테고리의 다른 글

07. 등수, 날짜타입  (0) 2024.05.24
06. 데이터프레임 합치기  (0) 2024.05.24
05. 그룹, 중복값제거  (0) 2024.05.24
04. 행, 열 추가 삭제, 통계함수  (0) 2024.05.24
03. 결측값(NULL, NaN)  (0) 2024.05.24