ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Pandas] Pandas를 통한 데이터 전처리
    Data Science/Pandas & Numpy&Scikit-learn 2022. 9. 13. 23:15
    반응형

    1. Pandas 인스톨 및 import

    pip install pandas
    import pandas as pd
    # as pd의 의미는 앞으로 pandas를 pd라는 약자로 부르겠다

    2. 데이터프레임 생성

    2.1 파일로부터 데이터프레임 생성

    df = pd.read_csv("파일위치/파일이름.csv")
    인자이름 기본값 변경가능값 의미
    sep ',' 구분자로 사용할 문자열 컬럼간 구분자
    csv의 구분자인 ','가 기본값이다
    header 'infer' None 파일에 항목이름(column)이 없을경우 None으로 설정
    names 없음 항목이름 리스트 읽어오는 데이터의 항목이름 설정
    usecols None 항목이름 리스트 지정된 항목만 읽어옴

     

    df = pd.read_csv('myfile.txt', header=None, delimiter='\t', names=['id','name','score'])
    # myfile.txt를 읽어온다
    # header는 없다
    # 구분자는 '\t'으로 한다
    # 데이터 항목 이름은 id, name, score으로 한다

    2.2 딕셔너리로부터 데이터프레임 생성

    dic = {
        "name": ["Kim", "Lee", "Youn"],
        "age": [26, 45, 20],
        "car": [True, False, False]
    }
    df = pd.DataFrame(dic)

    2.3 리스트로부터 데이터프레임 생성

    lst = [[ "Kim", 26, True ],
           ["Lee", 45, False],
           ["Youn", 20, False]] 
    titles = ['name', 'age', 'car']
    df = pd.DataFrame(lst, columns=titles)

    3. 데이터프레임 정보 확인하기

    # 더미데이터
    dic = {
        "name": ["Kim", "Lee", "Youn", "Hong", "Kang"],
        "age": [26, 45, 20, None, 37],
        "car": [True, False, False, True, False],
        "family": [2,3,4,4,3]
    }
    df = pd.DataFrame(dic)

    3.1 info

    df.info()
    #Range Index : 5 entries, 0 to 4 => 5개의 행이 있으며 인덱스는 0부터 4이다
    #Data columns (total 4 columns) => 데이터 열(컬럼)은 총 4개 있다
    #Column => 컬럼 이름
    #Non-Null Count => Nan이 아닌 값의 수
    #Dtype => 데이터 타입 종류

    3.2 describe

    df.describe()

    3.3 Count

    주어진 데이터프레임의 전체 또는 특정 열에 대해서 개수 반환

    df.value_counts()

    df['car'].value_counts()

    3.4 Unique

    df['car'].unique()

    4. 정렬

    df.sort_values(by='age',ascending=False)
    # age 컬럼을 기준으로 정렬
    # ascending=False는 내림차순을 의미(True는 오름차순)

    df.sort_index(ascending=False)
    # 인덱스를 기준으로 정렬

    df.sort_index(axis=1)
    # axis=1이기 때문에 좌측의 인덱스가 아닌 컬럼기준 정렬

    5. 데이터 행/열 선택

    5.1 열 선택

    # 여러방법을 통해서 불러올 수 있다
    df['name']
    
    df.name
    
    df.loc[:,'name']
    
    # 다중 열 선택
    df[['name','age']]
    
    df.loc[:,['name','age']]

    5.2 행 선택

    # 하나의 행만 불러오기
    df.name[0]
    
    # 인덱스 1~3 불러오기
    df.loc[1:3,['name','age']]
    
    # 인덱스 2부터 끝까지 불러오기
    df.loc[2:,['name','age']]

    데이터 행/열 선택에서 다중조건을 적용하는 심화과정은 아래의 포스팅 참고

    [Python]다중 조건으로 데이터 프레임 특정 행 추출하기(데이터 프레임 필터링)

    6. 열 생성/삭제

    6.1 열 생성

    6.2 열 삭제

    df = df.drop(['name','total'],axis=1)

    7. 중복 확인/제거

    7.1 중복 확인

    중복값이 존재하는 행에 대해서 True 반환

    # 데이터 생성
    dic = {
        "name": ["Kim", "Lee", "Youn", "Lee", "Kim"],
        "year": [2014, 2015, 2016, 2015, 2014],
        "points": [1.5, 1.7, 3.6, 2.4, 1.5]
    }
    df = pd.DataFrame(dic)
    
    # 전체 행의 중복 확인
    df.duplicated()
    
    # year 컬럼의 중복 확인
    df.duplicated(["year"])
    df.duplicated(["year"],keep=False)
    
    # keep 인자의 기본값은 First
    # first : 후에 나타난 값을 중복으로 취급
    # last : 먼저 나타난 값을 중복으로 취급
    # False : 둘다 중복으로 취급

    7.2 중복 삭제

    # 한개의 컬럼(name)이 중복일 경우 삭제
    df2 = df.drop_duplicates(["name"],keep='last')
    
    # 두개의 컬럼(name, points) 모두 중복일 경우 삭제
    df3 = df.drop_duplicates(["name","points"],keep='last')

    8. 결측치

    8.1 결측치 찾기

    # 데이터 생성
    dic = {
        "name": ["Kim", "Lee", "Youn", None, "Kim"],
        "year": [2014, 2015, 2016, None, None],
        "points": [1.5, 1.7, 3.6, 2.4, 1.5]
    }
    df = pd.DataFrame(dic)
    
    # Nan의 위치 T/F로 반환
    print(df.isnull())
    
    # 각 컬럼별 Nan 개수 반환
    print(df.isnull().sum())

    8.2 결측치 제거

    print(df)
    
    # Nan이 포함된 모든 행 삭제
    df2 = df.dropna()
    print(df2)
    
    # name 컬럼에 Nan이 있는 행 삭제
    df3 = df.dropna(subset=['name'])
    df3

    thresh라는 파라미터를 통해서 관측값이 n개 미만일 경우에 삭제 하는 조건을 걸 수 있다.

    dic = {
        "name": ["Kim", "Lee", "Youn", "Kim"],
        "year": [2014, 2015, 2016, None],
        "points": [1.5, 1.7, None, None]
    }
    df = pd.DataFrame(dic)
    
    df3 = df.dropna(thresh=2)
    df3

     

    8.3 결측치 치환

    # 데이터 생성
    dic = {
        "name": ["Kim", "Lee", "Youn", None, "Kim"],
        "year": [2014, 2015, 2016, None, 2018],
        "points": [1.5, 1.7, 3.6, 2.4, 1.5]
    }
    df = pd.DataFrame(dic)
    print(df)
    
    # 모든 Nan을 0으로 치환
    df2 = df.fillna(0)
    print(df2)
    
    # year 컬럼의 Nan값을 year컬럼의 평균으로 치환
    import numpy as np
    df3 = df.copy()
    df3['year'] = df3['year'].fillna(np.mean(df['year']))
    print(df3)
    
    # year 컬럼의 Nan값을 이전행의 값으로 치환
    df4 = df.copy()
    df4['year'] = df4['year'].ffill()
    print(df4)
    
    # year 컬럼의 Nan값을 이후행의 값으로 치환
    df5 = df.copy()
    df5['year'] = df5['year'].bfill()
    print(df5)
    
    # year 컬럼의 Nan값을 이전 이후행의 사잇값으로 치환
    df6 = df.copy()
    df6['year'] = df6['year'].interpolate()
    print(df6)

    9. Gourpby

    특정 컬럼에 대해서 같은 값을 가지는 행끼리 묶어주는 메서드(함수)

    dic = {
        "name": ["Kim", "Lee", "Youn", "Lee", "Kim"],
        "year": [2014, 2015, 2016, 2015, 2014],
        "points": [1.5, 1.7, 3.6, 2.4, 1.5],
        "dept" : ["CSE", "EE", "CSE", "CSE", "EE"] 
    }
    df = pd.DataFrame(dic)
    print(df)
    
    # 각 그룹에 대해서 통계치를 반환
    df[['year','points','dept']].groupby('dept').agg(['count','mean','max','min'])
    
    # groupby를 for문에서 받을 경우
    for x in df.groupby('dept'):
        print("x[0]은 : ",x[0])
        print("x[1]은 :\n",x[1])
        break

    반응형

    댓글

Designed by Tistory.