[Basic] 개념, 데이터 읽고 저장, 기본 함수

고보·2024년 2월 1일

1 기본 개념

  • 판다스(Pandas): 데이터 수정/가공/분석이 용이하다. numpy 기반으로 데이터 처리 빠름. 수학적으로 변경, 계산시 엑셀보다 빠르다.
  • 시리즈(Series): 1차원 배열. 단순히 파이썬 리스트를 간직한 객체. 리스트를 패러미터로 주면 바로 시리즈가 생성된다.
  • 데이터프레임(DataFrame). 2차원 배열로, 가로축은 행(row), 세로축은 열(column). 각각의 열(column)은 하나의 시리즈 객체. 하나의 열은 모두 같은 데이터 타입, 각각의 열은 다른 데이터 타입이어도 된다.
  • 관행으로 pandas as pd로 import.

2 데이터 읽고 저장

  • 데이터 타입 종류
    • csv: comma separated values
    • tsv: tab separated values
    • xml: 데이터 저장, 전송하는 마크업 언어
    • json: json 문자열
    • pickle: 파이썬 객체를 직렬화하고 저장하는데 사용

2-1 다른 데이터 -> DataFrame

  • df = pd.read_csv('../data/gapminder.csv') => txt, csv, tsv 다 읽을 수 있음. sep만 제대로 설정하면.
    • 매개변수들
      • sep = '\t': 텍스트 파일의 열을 구분하는 방법. 디폴트는 ','
      • header = None: header=0이면 1행을 열 이름으로 인식하고 그 아래부터 출력(그 위는 날린다). header=1이면 2행부터. default는 1행부터.
      • names = [열이름, 열이름]: 열 이름 리스트를 따로 지정
      • index_col = 0: 디폴트로 1열을 인덱스로 인식, 이미 다른 인덱스가 있을 때 이를 통해 지정. 0은 1열이 인덱스라는 것.
      • dtype = {'ISBN':str, '주제분류번호':str}: 열 데이터 타입을 수동 지정
      • low_memory = False: 효율적으로 메모리 사용 안하고 한거번에 처리.
      • encoding = EUC-KR: 인코딩 지정. 인코딩으로 에러 뜰 때. , utf-8도 많이 씀. 전 세계 모든 문자 표현.
      • keep_default_na: Na 값으로 원래 읽는 빈 문자열, NA, NULL 등을 누락값으로 읽지 않음.
      • na_values = '-': 여기서 지정한 값을 NA로 읽음. 위에서 keep_default_na로 해도, 여기서 지정한 건 NA로.
      • thousands = ',': 데이터에 1,000과 같이 천단위마다 쉼표가 포함되어 있으면, 그걸 제대로 읽을 수 있게.
  • read_excel(): 엑셀 읽기
    • sheet_name = '직종코드' 아래 있는 sheet 특정
    • usecols = 'B, D, G, J, N': 엑셀에서 B D G J N 열만 들고온다.
  • pd.read_json(str): Json 문자열 데이터 프레임으로
  • pd.DataFrame(dict): Json 파이썬 객체를 데이터 프레임으로
df = pd.DataFrame({
	'name': ['a', 'b'], #칼럼이름:[각행 요소들]
    'age': [1, 2]
    }]

df = pd.DataFrame(
	data = {'age': [1, 2]}, #데이터 = 칼럼이름:[각행 요소들]
    index = ['a, 'b,], #인덱스 열 지정
    columns = ['age'] #열 이름 지정
    ) 
  • pd.read_xml(xml파일): xml 파일을 데이터 프레임으로
  • pd.read_pickle(pickle파일)
  • pd.read_spss(sav): sav는 통계 분석 소프트웨어 spss 전용 파일로 pyreadstat 패키지 설치하면 pandas통해 불러올 수 있음

2-2 데이터 프레임 -> 다른 파일

  • df.to_csv('디렉토리/파일명.csv'): CSV로
    • 매개변수
      • index = False: 인덱스 빼고 저장
      • encoding='cp949': 인코딩 양식 지정. cp949는 한글 윈도우즈 환경에서 사용되는 인코딩.
      • header=True: 첫 행에 열 이름을 헤더로 포함.
  • df.to_excel('디렉토리/파일명.'): 엑셀로
    • 매개변수들
      • engine = : excel로 저장할 때 쓰는 엔진 지정. 디폴트는 openpxyl. xlsx(2007년 이후 엑셀 파일) 저장하는데 주로 사용
        (xls는 2003년 이전 엑셀 파일)
  • df.to_json('디렉토리/.json'): json으로

3 데이터 프레임 만들기

3-1 시리즈 만들기

  • s = pd.Series([, , ]): 하나의 시리즈(column) 생성
    • index = [ , ,]: 매개변수로 인덱스 이름 지정 가능
    • type해보면 list가 아니라 series
    • s.index s.values: 하면 인덱스, values 나옴

3-2 데이터프레임 만들기

  • df = pd.DataFrame(): 데이터프레임 만들기
    • 매개변수
      • data = : 받는 데이터. list, array, dictionary, series 등 가능.
      • index = [ , ,]: 매개변수로 인덱스 이름 지정 가능. default는 None으로, 이 경우 정수형 인덱스 자동 생성.
      • columns = [, , ]: 열 이름 지정 가능. default는 None으로, 이 경우 정수형 인덱스 자동 생성.
      • dtype = [, , ]: 각 열 데이터 타입 지정. 디폴트는 None으로 DataFrame이 자동 유추.
      • copy = 'False': 데이터를 복사하지 않고 참조할지, 복사할지. default는 False.

4 기본 함수, 메서드, 속성

  • df.head(숫자): 위에서 숫자 만큼의 행 데이터 추출. 디폴트는 5

  • df.tail(숫자): 아래에서 숫자 만큼의 행 데이터 추출. 디폴트는 5.

  • type(df): 타입 확인 가능.

  • df.shape: 행, 열이 각각 몇 개인지 튜플로 출력 =>[0] 행 개수, [1] 열 개수.
    () 안붙은 건 그냥 속성 호출.

  • df.columns: 열 정보 출력. 리스트와 비슷하지만 다른 타입 객체. = []로 열 이름 집어넣기 가능.

  • df.index: 인덱스 정보 출력. 리스트와 비슷하지만 다른 타입 객체.
    df.index = df[열]로 하면 특정 열을 인덱스로 사용 가능.

  • df.keys(): 속성이 아닌 메서드. index속성과 같은 역할.

  • df.values: 값 정보 출력.

  • df.dtypes: 각 열의 데이터 타입 출력. 문자형은 str이 아닌 object로 출력

  • df.info(): 열 이름, 비어있지 않은 값의 수, 칼럼별 데이터타입 한거번에 확인

  • df.copy(): 데이터프레임 복사본 만들기

  • df.astype({'열이름': 'int32', '열이름2':'float64'}): 열의 데이터타입 지정.

  • df.rename(columns={'before1':'after1', 'before2':'after2'}) => 열 이름을 바꾼다.

    • mapper, index, columns: 이름 변경에 사용될 매핑을 정의합니다. mapper는 함수 또는 딕셔너리가 될 수 있으며, axis를 기반으로 적용됩니다. index와 columns는 각각 행 인덱스와 열 이름의 변경을 위해 직접적으로 딕셔너리, 함수 형태로 제공될 수 있습니다.
    • axis: 변경할 축을 지정합니다. 0 또는 'index'는 인덱스(행)에, 1 또는 'columns'는 열에 적용됩니다.
    • copy: 기본적으로 True입니다. True인 경우, 원본 데이터는 변경되지 않고 복사본이 변경됩니다.
    • inplace: True로 설정하면, 변경 사항을 데이터프레임에 바로 적용하고 아무 것도 반환하지 않습니다. 기본값은 False이며, 이 경우 변경된 새 데이터프레임을 반환합니다.
    • level: 멀티인덱스를 사용하는 경우, 변경할 레벨을 지정합니다.
    • errors: 이름 변경 시 오류 처리 방법을 지정합니다. 기본값은 'ignore'이며, 이 경우 매핑에서 찾을 수 없는 레이블에 대해 오류를 발생시키지 않습니다. 'raise'를 지정하면 매핑에서 레이블을 찾지 못할 경우 오류를 발생시킵니다.
  • df.assign(**kwarg): 데이터프레임에 새 열 추가하거나, 기존 열 정해서, 새로운 데이터프레임 반환. 기존 데이터프레임 직접 변경X
    df.assign(C=lambda x: x['A'] * 2) => ['A']라는 열만 *2한 값으로.
    ebola = ebola.assign(month = ebola['date_dt'].dt.month, day = ebola['date_dt'].dt.day) => month, day 열 추가

  • df.set_index('열이름', inplace=True): 지정한 열을 인덱스로. inplace=True로 하면 원본 수정.

  • df.reset_index(): 기존 행 인덱스 제거하고, 인덱스를 데이터 열로 추가해서 인덱스 새로 부여.

  • df.reindex(리스트): 프레임의 인댁스와 컬럼을 새로운 인덱스와 컬럼으로 재배열. 새 인덱스나 컬럼이 기존 데이터프레임에 없으면 해당 위치는 NaN으로 채워진다.

    • 매개변수
    • index=: 새 행 인덱스로 쓸 리스트. 그냥 값만 넣으면 이걸로 들어감.
    • columns=: 컬럼 레이블로 사용할 리스트
    • method=: 인덱스 재배열시 사용할 보간 방식. ffill, bfill 등.
    • fill_value: 재색인 과정에서 새로 추가되는 레이블에 채워넣을 기본값
    • copy=True: 새 인덱스가 이전 인덱스와 동일해도 데이터 복사.
  • &, |, ~: and, or, not. 불리언 배열 만드는데 and 등으로 조건 입력하면 안되고, 이렇게 사용. 그리고 각각 ()로 명확히 구분을 해줘서 연결해야 한다.

  • df['열이름'].isin(['값1', '값2']): 값을 비교할 때, isin을 사용하면 여러 값들을 집어넣을 수 있다.

  • df1.equals(df2): 2개가 같은지 확인. 같으면 True.

  • df['열이름'].unique(): 시리즈에서 고윳값(중복되지 않는 값)을 numpy 배열로 return

  • df['열이름'].sample(10): 열에서 샘플 10개를 무작위로 뽑는다. - 데이터프레임 내부에 접근하는 접근자들

  • df.count(): 각 열의 NaN이 아닌 개수의 센다.

  • df.query('sex == "male"'): DF 내에서 조건 만족하는 데이터 필터링. 이때 조건은 하나의 string으로 받는다. 즉, 'sex'=='male'이 아니라 'sex == "male"'이다. 이 안에 변수를 넣을거면 @을 변수 앞에 붙인다.

  • np.where(조건, , x, y): 배열 내에서 조건을 만족하는 요소의 위치(인덱스)를 찾는 데 사용.
    np.where(df['열이름']>3): 그 열에서 3보다 큰 값만 선택
    뒤의 x, y는 입력해도 되고 안해도 됨. 입력하면, 조건에 맞는 건 x로 바꾸고, 안맞는 건 y로 바꾼다.
    np.where(welfare['sex'] == 9, np.nan, welfare['sex']): 9라는 이상치가 있으면 결측값으로 바꾸고, 아니면 기존의 값으로.
    welfare['sex'] = np.where(welfare['sex'] == 1, 'male', 'female') sex가 1이면 male로, 아닌 건 female.로

  • 지정자 사용 ex) df['열이름'].upper() => series에 .upper메서드를 쓸 수 없어서 안먹는다. string에 써야 하기 때문에.

    • .str: 그 열의 내부에 있는 string 요소에만 접근해서, 적용. df['열이름'].str.upper()
    • .dt: 그 열 내부에 있는 datetime에만 접근해서 적용. df['열이름'].dt.year
    • .cat: 그 열 내부에 있는 범주형 데이터에 접근해서 적용. df['열이름'].cat.add_categories(new_categories)
    • .sparse, .plot, .array도 있다.
    • 숫자는 기본적으로 pandas가 숫자 데이터타입의 벡터화된 연산을 지원하기에 별도로 없다.
  • to_dict(): 데이터프레임에 적용하면 {열이름: {인덱스:값, 인덱스:값}, 열이름:{인덱스:값, 인덱스:값}} 형태의 딕셔너리가 된다. => set_index랑 같이 쓰면, 인덱스를 원하는 값으로 지정 가능

profile
일본에서 일하는 게임 기획자. 시시해서 죽어버리지 않게, 재밌고 의미 있는 컨텐츠에 관심 있습니다. 그 도구로 데이터, AI도 찝적댑니다.

0개의 댓글