데린이 재영

판다스(Pandas) 이해하기 - Series, DataFrame 본문

멋사 AI school 7기/TIL

판다스(Pandas) 이해하기 - Series, DataFrame

재용용 2022. 10. 8. 20:50

 목표 설정

- 멋쟁이사자 AI 스쿨 3일차(220921) 학습 내용 정리하기

- Pandas 라이브러리에 대해 이해하기


 배운 내용 정리

  • 분석에 주로 사용할 라이브러리
    • pandas, numpy, matplotlib, seaborn 등
    • 시각화 - 심리적인 정보 전달 (다양한 라이브러리로 데이터 표현 가능)
    • Matplotlib : 정적인 데이터 표현 (수학적 연산에 대한 그래프를 그려주는 라이브러리)
    • Javascript : 동적인 데이터 표현
  • Pandas (판다스)
    • 엑셀과 같이 행, 열로 된 구조를 다루는 데이터 분석 도구
    • DataFrame과 Series 이해 필요
  • Numpy (넘파이)
    • 파이썬에서 사용할 수 있는 공학용 계산기
    • 파이썬은 접착제 언어라서 다른 언어와의 연결을 통해 직간접적으로 성능 향상 가능
  • Pandas 주요 기능 
    • df[[컬럼명, ...]] : 2개 이상의 컬럼 가져오기
    • df.loc[] : 행을 기준으로 데이터 가져올 때 사용 (인덱스 값을 기준으로 가져오는 경우)
    • df.iloc[행, 열] : 순서를 기준으로 가져올 때 사용 (정수값만 넣을 수 있음)
    • df.set_index() : 인덱스 부여하는 기능, 컬럼명을 넣으면 index 값으로 들어감 (이때 loc 사용하면 인덱스 값을 넣을 때 오류남)
    • df.reset_index() : index 지정해준거 리셋하는 방법 ( df 다시 할당해줘야지 저장됨 )
    • del df["컬럼명"] 또는 df = df.drop(["컬럼명"], axis=1) : 열을 기준으로 데이터 삭제하는 방법
      • del은 df에 다시 부여 X, drop은 df에 다시 할당해줘야 저장됨
    • bool index / boolean index ( | : or & : and )
      • 예) df[“약품명”].str.contains(“vita|비타”)  ▶  'vita' 또는 '비타' 가 들어간 항만 True, 나머지 False 나옴Pandas 주요 기능
    • bool Indexing (dataset)
      • 예) df_1 = df[df[“dataset”] == “I”]  ▶  df[“dataset”] == “I” 가 True인 것만 df_1로 저장
    • df.head() : 상위 5개 데이터 가져오기   ▶  df.iloc[:5] 기능
    • df.tail() : 하위 5개 데이터 가져오기   ▶  df.iloc[-5:] 기능
    • df.sample(개수) : 랜덤하게 데이터 추출
      • random_state : 같은 환경에서 같은 값이 나오게, 실험을 비교하기 위해 사용 (값이 크건 작건 상관 없고, 값 고정 역할)
      • frac : 추출할 표본의 비율 (예: frac=0.05, 전체 데이터 중에서 5%만 가져오겠다. frac=1은 전체 데이터를 뜻 함)
    • 데이터 요약하기
      • df.info() : 데이터 프레임의 정보를 확인 할 수 있음 (결측치 개수, 컬럼별 데이터 타입 등)
      • df.shape : 데이터 프레임의 크기를 확인할 수 있음   ▶  (행, 열)로 반환
      • df.dtype : 컬럼별 데이터 타입만 확인할 수 있음
      • df.describe() : 수치형 변수에 대한 기술통계 값 (총 개수, 평균, 표준편차, 최솟값, 최댓값, 사분위수)
      • df. describe(include="object") : 범주형 변수에 대한 기술통계 값 ( 총 개수, 유일값, 최빈값, 최빈값의 빈도수)
    • 파생변수 만들기
      • df[새로운 컬럼 이름] = df[칼럼].str.lower()   ▶  소문자 변경하여 새로운 컬럼 생성
      • df[새로운 컬럼 이름] = df[칼럼].str.contains(문자찾기)   ▶  문자 찾고 새로운 컬럼 생성
    • 정렬하기
      • df.sort_values(by=컬럼명, ascending=False)
      • df.sort_values(by=[컬럼명, ... ], ascending=[False, True])
      • ascending : 오름차순/내림차순 설정 가능
    • 파일로 저장하기 / 파일 불러오기
      • df.to_csv("저장할 파일 이름", index=False, encoding="cp949")   ▶  index=False : 저장 시, 인덱스 추가X
      • pd.read_csv("파일 이름", encoding="cp949") 
      • "cp949" : 한글을 지원하는 인코딩 (엑셀 파일로 저장할 때 주로 사용)
    • df.corr() : 상관계수를 알 수 있음
      • -1 ~ +1 사이의 값을 가짐
      • +1에 가까우면 양의 상관을 가짐
      • defalt 값 : 피어슨 상관계수
    • 데이터 개수 세기
      • df.count() : 각 열에 몇 개의 데이터가 있는지 알 수 있음 (Null 값 제외)
      • df.size() : 각 열에 몇개의 데이터가 있는지 알 수 잇음 (Null 값 포함)
      • df["컬럼명"].value_counts() : 특정 컬럼의 요소별 빈도수 구하기
        • df["컬럼명"].value_counts(normalize=True)  ▶  전체 빈도수의 합을 1로 만들어 줌 (정규화)
    • Group by
      • dataset별 기술통계 구할 수 있음 (한눈에 비교하기 좋음)

Group by를 나타내는 그림


Pandas  내용 보충

Series : 1차원 자료구조
- 1차원 리스트와 유사하지만 Series는 index에 이름을 부여할 수 있음
DataFrame : 2차원 자료구조
- 행(row)와 열(column) 으로 이루어 짐
  •  

1. Series

📍시리즈 만드는 방법

: dictionary, list, np.array 를 pd.Series로 타입 변환 가능

>>> age = [10, 20, 30]
>>> pd.Series(data=age)
0  10
1  20
2  30
dtype: int64

: index 이름 부여 (dtype은 인덱스의 데이터 타입이 아님)

>>> price = [1200, 2000, 3000]
>>> pd.Series(data=price, index=['떡볶이', '라면', '우동'])
떡볶이  1200
라면  2000
우동  3000
dtype: int64

📍시리즈와 리스트의 차이

(i) 연산

nums = [1, 5, 7, 9, 11]
s_nums = pd.Series(data=nums)
s_nums * 10
>>> 
0  10
1  50
2  70
3  90
4  110
dtype: int64
  • nums * 10 를 하면, 안에 있는 요소들이 10번 반복됨
  • nums + 3 를 하면, 아래와 같은 오류 발생
    TypeError: can only concatenate list (not "int") to list

(ii) 인덱스

bunsick_price = [3000, 1500, 4000, 2000, 3500]
bunsick_list = ["떡볶이", "어묵", "순대", "닭강정", "우동"]
bunsick = pd.Series(data=bunsick_price, index=bunsick_list)
bunsick
>>>
떡볶이    3000
어묵     1500
순대     4000
닭강정    2000
우동     3500
dtype: int64
print(bunsick[0])
print(bunsick["닭강정"])
>>>
3000
2000
  • 인덱스 값에 이름을 부여할 수 있다.
  • dictionary 와 유사하게 값과 이에 대응되는 인덱스 값으로 서로 연결되어 있음

(iii) index와 value

bunsick.index
>>> Index(['떡볶이', '어묵', '순대', '닭강정', '우동'], dtype='object')
bunsick.values
>>> array([3000, 1500, 4000, 2000, 3500])
  • 각 데이터 타입은 pandas.core.indexes.base.Index, numpy.ndarray 이다.

2. DataFrame

📍데이터프레임 만드는 방법

pd.DataFrame(data, index)

📍데이터프레임 속성값

- index : index 반환
- columns : 컬럼 명 반환
- values : 각 값들을 반환
- dtypes : 컬럼 데이터 타입을 반환
- T : 데이터프레임 행, 열 치환

📍데이터프레임 정렬

- sort_index() : 행으로 정렬(axis=0), 열로 정렬(axis=1)
- sort_values() : 데이터 값을 기준으로 정렬
- 오름차순 : ascending=True, 내림차순 : ascending=False

MultiIndex 란?
정렬할 때, 값들이 비교하기에 적절하지 않은 상태라면?
예를 들어, 1, 3, "4" | A c D e 등의 형태를 정렬해야한다면?
=> lambda를 이용해 같은 형태로 변환 후 정렬하기

df = pd.DataFrame({"A": [5, 1, 3, 4]}, index=['b', 'A', 'E', 'd'])
df.sort_index(key=lambda x: x.str.lower())
>>>> 
   a
A  1
b  5
d  4
E  3

📍데이터 선택 방법

- loc : 라벨값 기반의 2차원 인덱싱
- iloc : 순서를 나타내는 정수 기반의 2차원 인덱싱
- at : 라벨값 기반의 2차원 인덱싱 (하나의 스칼라 값만 찾음)

📍데이터 추가

- Column 추가 : df['column명'] = 추가할 데이터
- Index 추가 : df.loc['index명'] = 추가할 데이터

📍데이터 삭제

: drop() : 데이터 삭제 함수

대표적인 매개 변수
- axis = 0 or 1 (행:0, 열:1 을 기준으로 삭제)
- index : 특정 index 에 대해 데이터 삭제
- columns : 특정 column 에 대해 데이터 삭제
- inplace = True or False : 원본 데이터를 수정할 지, 말 지에 대해 선택

📍누락 데이터 처리

: Null, NaN을 처리할 때 사용하는 함수

- dropna() : 누락된 데이터가 있는 축 제외 (매개변수 : axis, how, thresh, inplace 등)
- fillna() : 누락된 데이터를 특정 값으로 대체 (ex: fillna(0))
- isnull() : Null 값인지 확인 (True, False 로 반환)
- notnull() : Null 값이 아닌지 확인 (True, False로 반환)

📍기술 통계 함수

- sum : 합
- mean : 평균
- count : Null 값을 제외한 데이터의 수를 반환
- argmin, argmax : 최소, 최대를 갖고 있는 데이터의 위치를 반환
- quantile : 0부터 1 까지의 분위수를 계산
- describe : 시리즈나 데이터프레임의 각 칼럼에 대한 요약 통계를 계산
- var / std : 표준 분산 / 표준 정규 분산
- cumsum / cumprod : 누적 합 / 누적 곱
- pct_change : 퍼센트 변화율

참고문헌

(1) 추천하는 사이트 - 정리가 잘 되어있음

https://harryp.tistory.com/868

(2) 파이썬으로 배우는 알고리즘 트레이닝

https://wikidocs.net/4364

(3) 판다스 공식 문서

https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.at.html

(4) Group by 그림 출처

https://pandas.pydata.org/docs/getting_started/intro_tutorials/06_calculate_statistics.html

Comments