파이썬 Pandas (1)

Heath_Jeong·2021년 3월 6일
0

Ustage Week2 - AI Math

목록 보기
4/9

Pandas

  • panel data
  • 구조화된 데이터의 처리를 지원하는 파이썬 라이브러리
  • 고성능 계산 라이브러리 numpy 와 통합하여, 강력한 스프레드시트 처리 기능 제공
  • 인덱싱, 연산용 함수, 전처리 함수 등 제공, 데이터 처리 및 통계 분석을 위해 사용
  • 테이블, 어트리뷰트(피쳐), 인스턴스(튜플), 피쳐벡터(세로열), 데이터(하나의값)가 있음
  • 이미지 같은거 처리하는 도구가 아님

설치

  • 콘다 가상환경에서 conda install pandas 로 설치

실행

import pandas as pd
data_url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/housing/housing.data'
df_data = pd.read_csv(data_url, sep='\s+', header = None) # sep 은 정규식
df_data.head()
  • 결과

기본 사용

series

  • (DataFrame : Data Table 전체를 포함하는 Object)
  • Series : DataFrame 중 하나의 Column 에 해당하는 데이터 모음 Object
  • 인덱스, 값, 데이터 타입이 나옴, numpy.ndarray 타입
  • 딕트도 넣을 수 있음 → 자동으로 키는 인덱스, 밸류는 값이 됨
list_data = [1, 2, 3, 4, 5]

example_obj = pd.Series(data = list_data)
example_obj
'''
0    1
1    2
2    3
3    4
4    5
dtype: int64
'''

dict_data = {'a' : 1, 'b' : 2}
example_obj = pd.Series(dict_data)
example_obj.name = "number"
example_obj.index.name = "alphabet"
example_obj

'''
alphabet
a    1
b    2
Name: number, dtype: int64
'''

example_obj.index
# Index(['a', 'b'], dtype='object', name='alphabet')

# index 값 기준으로 series 생성
dict_data = {'a' : 1, 'b' : 2, 'c' : 3, 'd' : 4, 'e' : 5}
indexes = ['a', 'b', 'c', 'd', 'e', 'f']
series_obj = pd.Series(dict_data, index=indexes)
series_obj
'''
a    1.0
b    2.0
c    3.0
d    4.0
e    5.0
f    NaN
dtype: float64
'''

DataFrame

  • 시리즈 데이터들의 모임, 테이블이기도 함, 기본 2차원, 주로 csv 나 엑셀 형태로 불러냄

  • 컬럼마다 데이터 타입이 다를 수 있음

  • 인덱스와 컬럼으로 접근 가능

  • df["first_name"] 와 df.first_name 은 같음. fist_name 컬럼 불러옴

  • 인덱싱

    • loc - index 이름

    • iloc - index 번호

      # 값 중 3 이 나올때까지 추출
      df.loc[:3]
      '''
      first_name	last_name	age	city
      0	Jason	Miller	42	San Francisco
      1	Molly	Jacobson	52	Baltimore
      2	Tina	Ali	36	Miami
      3	Jake	Milner	24	Douglas
      '''
      
      # 인덱스 3 전까지 추출
      df.iloc[:3]
      '''
      first_name	last_name	age	city
      0	Jason	Miller	42	San Francisco
      1	Molly	Jacobson	52	Baltimore
      2	Tina	Ali	36	Miami
      '''
  • 자세한 코드는 DataFrame 에 있습니다.

  • boolean index 로 값 설정 가능

df.debt = df.age > 40
df
'''
first_name	last_name	age	city	debt
0	Jason	Miller	42	San Francisco	True
1	Molly	Jacobson	52	Baltimore	True
2	Tina	Ali	36	Miami	False
3	Jake	Milner	24	Douglas	False
4	Amy	Cooze	73	Boston	True
'''
  • to_csv() : csv 형태로 변환, 파라미터 조절하면 저장도 가능
  • 컬럼 삭제
    • del df["debt"] → 아예 테이블에서 삭제해버림
    • df.drop("debt", axis=1) → 리턴해주고 원본은 안바뀜

Selection & Drop

selection : 시리즈(컬럼) 불러오는 작업
  • 엑셀 파일 다룰 때 !conda install --y xlrd 로 xlrd 설치

  • 컬럼명으로 뽑기

    • df["a"] → Series 로 뽑힘, df[["a"]] → DataFrame으로 뽑힘
  • 인덱스로 뽑기

    • df["account"][:3] → 어카운트 시리즈의 0, 1, 2 인덱스 지닌 값들 뽑음
    • 인덱스가 영어인데 숫자로 부르면 안 뽑아짐
  • fancy index, boolean index 가능

  • 인덱스값 설정, df.account = df["account"]

  • 데이터 뽑는 방식 (중요)

    1. df["name", "street][:2] # 컬럼과 인덱스 네임
      : 해당 시리즈의 인스턴스 2개 가져옴
    2. df.loc[[211829, 320563], ["name", "street"] # row 네임, col 네임
      : 해당 인덱스에 해당 컬럼 값 가져옴
    3. df.iloc[:2, :2] # 로우 개수, 컬럼 개수
      : 2개 컬럼의 2개 인스턴스 가져옴
  • reset_index() : 인덱스 값 초기화 (0, 1, 2 ...), 원본 안바뀜

    • 프로퍼티로 inplace=Ture 하면 원본에 적용
    • 기본적으로 데이터프레임 원본 안건드릴려고 함
  • boolean index 로 셀렉션 가능

drop : 삭제하는 작업
  • df.drop("city", axis=1) # city 컬럼(axis=1) 삭제, 원본 안바뀜

Series operation

  • s1.add(s2) : s1 과 s2 합치는데 겹치는 인덱스가 없는 경우 NaN 으로 채워짐
    → s1 + s2 와 동일

DataFrame operation

  • df1.add(df2, fill_value=0) : 두 데이터 프레임 합치는데 (인덱스 + 컬럼 전부) 안 겹치는 공간은 NaN 으로 채움. fill_value 를 설정하면 NaN 대신 그 값으로 채움

    → df1 + df2 와 기본적으로 동일

Series + DataFrame

  • 데이터프레임의 컬럼과 시리즈의 인덱스가 같으면 브로드캐스팅 연산됨
  • add 에서 axis 를 설정하면 broadcasting 실행됨
df = DataFrame(np.arange(16).reshape(4, 4), columns=list("abcd"))
df
'''
a	b	c	d
0	0	1	2	3
1	4	5	6	7
2	8	9	10	11
3	12	13	14	15
'''

s = Series(np.arange(10, 14), index=list("abcd"))
s
'''
a    10
b    11
c    12
d    13
dtype: int64
'''

df + s
'''
a	b	c	d
0	10	12	14	16
1	14	16	18	20
2	18	20	22	24
3	22	24	26	28
'''

s2 = Series(np.arange(10, 14))
s2
'''
0    10
1    11
2    12
3    13
dtype: int64
'''

# 시리즈의 인덱스가 없어서 옆으로 붙임, NaN으로 전부 채워짐
df + s2 # == df.add(s2, axis=1)
'''
a	b	c	d	0	1	2	3
0	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN
1	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN
2	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN
3	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN
'''

df.add(s2, axis=0)
'''
a	b	c	d
0	10	11	12	13
1	15	16	17	18
2	20	21	22	23
3	25	26	27	28
'''

lambda, map, apply

map for siries

  • 판다스의 시리즈 다입의 데이터에도 맵 가능
  • function 대신 dict, sequence 형 자료등으로 대체 가능
s1 = Series(np.arange(10))
s1.map(lambda x: x**2).head()
'''
0     0
1     1
2     4
3     9
4    16
dtype: int64
'''

# dict 타입 적용
z = {1: 'a', 2: 'b', 3 : 'c'}
s1.map(z).head()
'''
0    NaN
1      a
2      b
3      c
4    NaN
dtype: object
'''

# DF 타입 적용
s2 = Series(np.arange(10, 20))
s2.map(s2).head()
'''
0   NaN
1   NaN
2   NaN
3   NaN
4   NaN
dtype: float64
'''
  • replace 처럼 딕트를 써서 데이터프레임의 어떤 값을 키와 매칭하여 밸류로 바꿔줄 수 있음
df["sex_code"] = df.sex.map({"male" : 0, "female" : 1})
df.head()
earn	height	sex	race	ed	age	sex_code
0	79571.299011	73.89	male	white	16	49	0
1	96396.988643	66.23	female	white	16	62	1
2	48710.666947	63.77	female	white	16	33	1
3	80478.096153	63.22	female	other	16	95	1
4	82089.345498	63.08	female	white	17	43	1

df.sex.replace({"male": 0, "female": 1}, inplace=True)
df.head()
earn	height	sex	race	ed	age	sex_code
0	79571.299011	73.89	0	white	16	49	0
1	96396.988643	66.23	1	white	16	62	1
2	48710.666947	63.77	1	white	16	33	1
3	80478.096153	63.22	1	other	16	95	1
4	82089.345498	63.08	1	white	17	43	1

apply

  • 맵과 다르게 시리즈 전체에 해당 함수를 적용, 시리즈 단위로 적용시키면 맵과 같은 효과
  • 입력 값을 시리즈 데이터로 받아 핸들링 가능
  • 내장 연산 함수 (sum, mean, std 등) 를 사용하는 것과 같은 효과
# 셋 다 똑같음
# 함수 정의 후 어플라이
f = lambda x: np.mean(x)
df_info.apply(f)

# 내장 함수 어플라이
df_info.apply(np.mean)

# 내장 함수 사용
df_info.mean()

'''
earn      32446.292622
height       66.592640
age          45.328499
dtype: float64
'''

pandas built-in function

describe

  • 가지고 있는 값 중 Numeric type (숫자들) 의 요약 정보를 보여줌

unique

  • 시리즈 데이터의 유일한 값을 리스트로 반환함

sum

  • 축을 기준으로 연산 진행
  • sub, mean, min ...

isnull

  • 테이블에서 값이 NaN(null) 인 데이터는 True 로 아니면 False 로 만들어서 DF 반환
  • isnull().sum() 하면 컬럼에 관해서 널값 개수 세어 줌

sort_values

  • 컬럼 값을 기준으로 정렬해줌
  • df.sort_values(["age", "earn"], ascending=True).head()

corr, conv, corrwith

  • corr : 상관계수 구해줌, 아규먼트로 시리즈 넣어도 되고 안넣으면 테이블 전체로 구해줌
  • cov : 공분산 구해줌
  • corrwith : 테이블과 아규먼트의 상관계수 구해줌
  • 위 작업들 할 때 스트링 값이면 난감하므로 라벨링 (0, 1) 등 으로 바꿔서 사용하면 용이

여러개 컬럼 다룰 때

  • 컬럼에 대한 리스트를 만들어서 수행

한 번에 볼 수 있는 양 조절

  • pd.options.display.max_rows = 100

참조

  • BoostCamp AI Tech
profile
데이터로 문제를 해결하는 엔지니어를 꿈꿉니다.

0개의 댓글