데이터 누락 다루기
pandas는 결측치를 numpy.nan 을 사용해서 표기하는데 이는 숫자와 달라 혼동을 피할 수 있다.
또 pandas는 결측치를 탐지하고 보정하는 함수를 제공한다.
결측치는 반드시 삭제하거나 맥락에 맞는 다른 값으로 교체해서 보정해야한다.
결측치 삭제
dropna() 함수는 결측치를 가진 열(axis=0,기본값) 이나 행(axis=1)의 일부 (how="any",기본값)
또는 전체 (how="all")를 삭제하고, '정제된' 데이터 프레임 복사본dmf 반환 한다.
데이터 프레임의 구조자체를 파괴하지 않는 한 결측치만 제거할 수는 없다..
nan_alco
Beer | Wine | Spirits | Water | |
---|---|---|---|---|
State | ||||
South Carolina | 1.36 | 0.24 | 0.77 | NaN |
South Dakota | 1.53 | 0.22 | 0.88 | NaN |
Samoa | NaN | NaN | NaN | NaN |
nan_alco.dropna(how="all")
Beer | Wine | Spirits | Water | |
---|---|---|---|---|
State | ||||
South Carolina | 1.36 | 0.24 | 0.77 | NaN |
South Dakota | 1.53 | 0.22 | 0.88 | NaN |
nan_alco.dropna(axis=1,how="all")
Beer | Wine | Spirits | |
---|---|---|---|
State | |||
South Carolina | 1.36 | 0.24 | 0.77 |
South Dakota | 1.53 | 0.22 | 0.88 |
Samoa | NaN | NaN | NaN |
결측치 보정
가장 흔한 보정 방법 두가지는 상수(0,1 등) 와 평균으로 교체하는 것이다.
우선적으로 insull(),notnull() 함수들을 이용해 어떤 값들이 비어 있는지 파악해야한다.
sp = nan_alco['Spirits'] #결측 값이 있는 열을 선택
clean= sp.notnull() #결측 값이 없는 행
sp[-clean]= sp[clean].mean() #정상적인 값의 평균으로 결측치를 보정한다
nan_alco
Beer | Wine | Spirits | Water | |
---|---|---|---|---|
State | ||||
South Carolina | 1.36 | 0.24 | 0.770 | NaN |
South Dakota | 1.53 | 0.22 | 0.880 | NaN |
Samoa | NaN | NaN | 0.825 | NaN |
# 상수를 이용해 전체 프레임의 결측치 보정
nan_alco.fillna(0)
Beer | Wine | Spirits | Water | |
---|---|---|---|---|
State | ||||
South Carolina | 1.36 | 0.24 | 0.770 | 0.0 |
South Dakota | 1.53 | 0.22 | 0.880 | 0.0 |
Samoa | 0.00 | 0.00 | 0.825 | 0.0 |
nan_alco.fillna(axis =1,method ="ffill")
Beer | Wine | Spirits | Water | |
---|---|---|---|---|
State | ||||
South Carolina | 1.36 | 0.24 | 0.770 | 0.770 |
South Dakota | 1.53 | 0.22 | 0.880 | 0.880 |
Samoa | NaN | NaN | 0.825 | 0.825 |
데이터 결합
- 일대일 결합 : 왼쪽 데이터 프레임의 각 행이 오른쪽 데이터 프레임의 행과 하나만 매칭
- 일대다 결합 : 왼쪽 데이터 프레임의 각 행이 오른쪽 데이터 프레임의 행과 2개이상 매칭
각 데이터 프레임에서 여러행이 겹칠 때는 다대닫 결합으로 마찬가지로 pandas는 필요한 만큼 행을 복제하고, '빈곳'에는 numpy.nan 을 집어넣는다.
population = pd.read_csv('./2020-08/excel/population.csv',index_col="State")
population.head()
Population | |
---|---|
State | |
Alabama | 4,780,131 |
Alaska | 710,249 |
Arizona | 6,392,301 |
Arkansas | 2,916,025 |
California | 37,254,522 |
alco2009.head()
Beer | Wine | Spirits | |
---|---|---|---|
State | |||
Alabama | 1.20 | 0.22 | 0.58 |
Alaska | 1.31 | 0.54 | 1.16 |
Arizona | 1.19 | 0.38 | 0.74 |
Arkansas | 1.07 | 0.17 | 0.60 |
California | 1.05 | 0.55 | 0.73 |
df = pd.merge(alco2009.reset_index(),population.reset_index()).set_index("State")
df.head()
Beer | Wine | Spirits | Population | |
---|---|---|---|---|
State | ||||
Alabama | 1.20 | 0.22 | 0.58 | 4,780,131 |
Alaska | 1.31 | 0.54 | 1.16 | 710,249 |
Arizona | 1.19 | 0.38 | 0.74 | 6,392,301 |
Arkansas | 1.07 | 0.17 | 0.60 | 2,916,025 |
California | 1.05 | 0.55 | 0.73 | 37,254,522 |
데이터 붙이기
concat() 함수는 수직이나 수평 축을 따라 여러 데이트 프레임을 이어 붙인 새로운 데이터 프레임을 반환.
pd.concat([alco2009,population],axis=1).head()
#축이 일치하지 않으면 pandas 가 '빈곳'에 결측치가 채워진 행이나 열을 새로 추가한다.
중복제거
- duplicated([subset]) 함수
- 각 행의 전체 혹은 일부(subset) 열이 중복됐는지를 의미하는 불시리즈를 반환
- 옵셔널 파라미터 keep으로 중복된 항목의 원본을 첫 번째('first')행으로 할지, 마지막('last') 행으로 할지, 중복된 모든 항목을 제거할지(False) 결정 할 수 있다.
- drop_duplicated() 함수
- 전체나 일부(subset) 중복된 열이 제거된 데이터 프레임이나 시리즈의 복사본을 반환
- duplicated([subset]) 함수와 마찬가지로 옵셔널 파라미터 적용가능
- 옵셔널 파라미터 inplace = True를 사용해 원본 데이터 프레임에서 중복된 항목 제거가능
데이터 정렬하기
- sort_index() 함수는 인덱스로 정렬된 데이터프레임을 반환, ascending 파라미터로 순서 조정 가능
- sort_values() 함수는 값으로 정렬한 데이터 프레임이나 시리즈 반환
- 데이터 프레임에서 첫 번째 파라미터는 열이나 열 리스트이며, 옵셔널 파라미터 ascending은 불 값이나 불 리스트다.
- nan_position 파라미터(first 나 last)는 nan을 어디에 저장할지 결정한다.
- rank() 함수는 데이터프레임이나 시리즈 값에서 숫자로 된 순위를 계산한다
population.sort_index().head()
Population | |
---|---|
State | |
Alabama | 4,780,131 |
Alaska | 710,249 |
Arizona | 6,392,301 |
Arkansas | 2,916,025 |
California | 37,254,522 |
population.sort_values("Population").head()
Population | |
---|---|
State | |
Rhode Island | 1,052,940 |
New Hampshire | 1,316,461 |
Maine | 1,328,364 |
Hawaii | 1,360,301 |
Idaho | 1,567,650 |
pop_by_state = population.sort_index()
pop_by_state.rank().head()
Population | |
---|---|
State | |
Alabama | 28.0 |
Alaska | 43.0 |
Arizona | 36.0 |
Arkansas | 17.0 |
California | 24.0 |
기술 통계
기술 통계 함수는 시리즈나 데이터 프레임의 각 열에서 sum(), mean(), meadian(), std(), count(), min(), max() 함수의 값을 계산한다.
alco2009.max()
Beer 1.72
Wine 1.00
Spirits 1.82
dtype: float64
alco2009.min(axis=1)
State
Alabama 0.22
Alaska 0.54
Arizona 0.38
Arkansas 0.17
California 0.55
Colorado 0.46
Connecticut 0.59
Delaware 0.57
District of Columbia 1.00
Florida 0.48
Georgia 0.25
Hawaii 0.53
Idaho 0.70
Illinois 0.39
Indiana 0.25
Iowa 0.18
Kansas 0.14
Kentucky 0.18
Louisiana 0.28
Maine 0.42
Maryland 0.37
Massachusetts 0.61
Michigan 0.31
Minnesota 0.37
Mississippi 0.11
Missouri 0.30
Montana 0.45
Nebraska 0.20
Nevada 0.58
New Hampshire 0.84
New Jersey 0.57
New Mexico 0.32
New York 0.46
North Carolina 0.34
North Dakota 0.25
Ohio 0.26
Oklahoma 0.18
Oregon 0.49
Pennsylvania 0.23
Rhode Island 0.53
South Carolina 0.24
South Dakota 0.22
Tennessee 0.21
Texas 0.28
Utah 0.17
Vermont 0.63
Virginia 0.43
Washington 0.51
West Virginia 0.10
Wisconsin 0.31
Wyoming 0.22
dtype: float64
alco2009.sum()
Beer 63.22
Wine 19.59
Spirits 41.81
dtype: float64
고유값, 카운팅, 멤버십
numpy는 배열을 셋으로 취급할 수 있다. pandas도 시리즈를 셋으로 취급할 수 있다.
- unique()와 value_counts() 함수는 각각 시리즈와 데이터 프레임에서 고유한 값으로 구성 된 배열을 만들고, 각 고유 값의 등장 빈도를 계산한다.
- 시리즈가 nan 값을 포함한다면 그 역시도 빈도 카운팅에 포함 할 수 있다.
- isin() 함수는 시리즈와 데이터 프레임의 각 아이템이 특정 묶음에 속하는지 여부를 불 형식으로 반환한다
dna='agtatagcgcgtagaccgt'
dna=dna.upper()
dna_as_series = pd.Series(list(dna),name="genes")
dna_as_series.head()
0 A
1 G
2 T
3 A
4 T
Name: genes, dtype: object
print(dna_as_series.unique())
print(dna_as_series.value_counts().sort_index())
['A' 'G' 'T' 'C']
A 5
C 4
G 6
T 4
Name: genes, dtype: int64
valid_nucs= list("ACGT")
dna_as_series.isin(valid_nucs).head()
0 True
1 True
2 True
3 True
4 True
Name: genes, dtype: bool
데이터 변환하기
사칙연산차
- pandas 는 사칙 연산자와 numpy 유니버셜 함수를 지원한다
alco = alco.set_index(["State","Year"])
alco['Total'] =alco.Beer+alco.Wine+alco.Spirits
alco.head()
Beer | Wine | Spirits | Total | ||
---|---|---|---|---|---|
State | Year | ||||
Alabama | 1977 | 0.99 | 0.13 | 0.84 | 1.96 |
1978 | 0.98 | 0.12 | 0.88 | 1.98 | |
1979 | 0.98 | 0.12 | 0.84 | 1.94 | |
1980 | 0.96 | 0.16 | 0.74 | 1.86 | |
1981 | 1.00 | 0.19 | 0.73 | 1.92 |
데이터 집계
데이터 집계는 데이터를 분리하고 적용하고 결합하는 세 단계로 구성된다
- 분리 단계에서는 키(key)를 사용해서 데이터를 여러 덩어리로 분리한다.
- 적용 단계에서는 각 덩어리에 집계 함수(sum() 이나 count() 함수 등을) 적용 한다.
- 결합 단계에서는 산출한 결과를 새로운 시리즈나 데이터 프레임에 담는다.
집계 함수에는 다음 함수들이 있다.
count() , sum() , mean() , median(), std(), var(), min(), max(), prod(), first(),last()
alco_noidx = alco.reset_index()
sum_alco = alco_noidx.groupby("Year").sum()
sum_alco.tail()
Beer | Wine | Spirits | Total | |
---|---|---|---|---|
Year | ||||
2005 | 63.49 | 18.06 | 38.89 | 120.44 |
2006 | 64.37 | 18.66 | 40.15 | 123.18 |
2007 | 64.67 | 19.08 | 40.97 | 124.72 |
2008 | 64.67 | 19.41 | 41.59 | 125.67 |
2009 | 63.22 | 19.59 | 41.81 | 124.62 |
매핑
--
가장 일반적인 형태의 데이터 변환
- map() 함수를 사용해 인자가 1개인 임의의 함수를 선택한 열의 모든 엘리먼트에 적용
- 전달하는 함수는 파이썬 내장 함수나 임포트한 모듈의 함수, 사용자가 정의한 함수 등이 될 수 있다.
# 세글가 약어로 된 주 이름을 만들어 보자
with_state = alco2009.reset_index()
abbrevs = with_state["State"].map(lambda x:x[:3].upper())
abbrevs.head()
0 ALA
1 ALA
2 ARI
3 ARK
4 CAL
Name: State, dtype: object
교차 집계
교차 집계는 그룹별 빈도를 산출하고 다른 두 카테고리 변수를 표현하는 행과 열로 된 데이터 프레임을 반환한다. 옵셔널 파라미터 margins = True 설정하면 이 함수는 행과 열의 소계도 계산한다.
wine_state = alco2009['Wine']>alco2009['Wine'].mean()
beer_state = alco2009['Beer']>alco2009['Beer'].mean()
pd.crosstab(wine_state,beer_state)
Beer | False | True |
---|---|---|
Wine | ||
False | 14 | 15 |
True | 12 | 10 |
pd.crosstab(wine_state,beer_state,margins=True)
Beer | False | True | All |
---|---|---|---|
Wine | |||
False | 14 | 15 | 29 |
True | 12 | 10 | 22 |
All | 26 | 25 | 51 |
Pandas 의 파일 입출력 다루기
pandas는 다음 기능을 제공한다
- 자동 인덱싱 및 열 이름 추출
- 데이터 타입 추론, 데이터변환, 결측치 탐지
- 날짜 및 시간 파싱
- 불필요한 데이터 제거(행,각주,주석 건너뛰기 : 천 단위 구분자 처리)
- 데이터 묶기
read_csv() 함수는 지정된 파일명이나 파일 핸들에서 데이터 프레임을 읽어온다.
read_csv()의 옵셔널 파라미터
- sep 또는 delimiter : 열 구분자. 정규표현식도 인자로 처리가능
- header : 열로 사용할 행 넘버. 별도의 열 이름 리스트가 있다면 None을 전달 한다.
- index_col : 인덱스로 사용할 열 이름. False를 전달하면 pandas가 기본 수치형 인덱스 생성
- skiprows : 파일에서 생략해야 할 첫 n번째 행이나 행 넘버 리스트
- thousands : 큰 숫자에서 천 단위 구분을 하는데 사용된 문자
- names : 열 이름 리스트
- na_values : 결측치로서 처리할 문자열이나 문자열 리스트.
'데이터 분석 > 데이터 분석 기초' 카테고리의 다른 글
chipotle 주문 데이터 분석(2) - 데이터 분석 기초 (0) | 2020.10.08 |
---|---|
chipotle 주문 데이터 분석(1) - 데이터 분석 기초 (0) | 2020.10.08 |
데이터 시각화 기초 (0) | 2020.09.18 |
매년 새해 첫날의 기온 그래프 - 데이터 분석 기초 (0) | 2020.09.18 |
pandas 기초(1) (0) | 2020.09.16 |