티스토리 뷰
# test Data
df1 = DataFrame({'a':[1,3,7,4],'b':[17,86,52,68],'c':[134,874,592,246]})
1. map 함수
- map(func, **iterable)
- 1차원 원소별 적용
- 다수의 인자 전달 시 각 인자의 크기 일치 필요
- in numpy
- Return to List
f1 = lambda x : '%03d'%x
list(map(f1, df1['b']))
['017', '086', '052', '068']
2. map 메서드
- data.map(func, **iterable)
- 1차원(Series) 원소별 적용
- 다수의 인자 전달 시 각 인자의 크기 일치 필요 없음
- in Pandas
- Return to Series
# 1차원(Series) 데이터 구조의 원소별 적용
f1 = lambda x : '%03d'%x
df1['b'].map(f1)
0 017
1 086
2 052
3 068
Name: b, dtype: object
3. apply 메서드
- data.apply(func, axis)
- 2차원(DataFrame)의 행별(axis=0), 열별(axis=1) 적용
- 주로 그룹함수와 함께 사용
- Return to Series
# 벡터로 전달 후 그룹함수 적용
f2 = lambda x : x.max() - x.min()
df1.apply(f2)
a 6
b 69
c 740
dtype: int64
df1.apply(f2, axis=1)
0 133
1 871
2 585
3 242
dtype: int64
df1.apply(sum,1)
0 152
1 963
2 651
3 318
dtype: int64
round(df1.apply(np.mean,1),2)
0 50.67
1 321.00
2 217.00
3 106.00
dtype: float64
# 여러 값을 리턴할 경우 Series 사용
f3 = lambda x : Series([x.min(), x.max()], index=['min','max'])
df1.apply(f3)
df1.apply(f3, 1)
4. applymap 메서드
- data.applymap(func, **iterable)
- 2차원 원소별 적용 가능
- 출력 결과 DataFrame
# 2차원(DataFrame) 데이터 구조의 원소별 적용
f4 = lambda x : '%03d'%x
df1.applymap(f4)
#. Q1
import pandas as pd
import numpy as np
from pandas import Series, DataFrame
from numpy import nan as NA
### data.txt 파일 불러오기
data = DataFrame(np.loadtxt('data.txt'))
data.dtypes
0 float64
1 float64
2 float64
3 float64
4 float64
dtype: object
### 1. 다음의 데이터를 읽어들여 다음과 같은 프레임 형태로 변경
20대 30대 40대 50대 60세이상
2000년 7.5 3.6 3.5 3.3 1.5
...
2013년 7.9 3 2 1.9 1.9
data.columns = ['20대','30대','40대','50대','60세이상'] # column name 변경
a1 = np.arange(2000, 2014) # row name 변경
f1 = lambda x : str(x) + '년'
data.index = list(map(f1, a1))
data
### 2. 2010년부터의 20~40대 실업률만 추출하여 새로운 데이터프레임 생성
data2 = data.loc['2010년': , :'40대'] # data.loc['2010년':'2013년','20대':'40대']
data2
### 3. 전체 데이터를 소수점 둘째자리의 표현식으로 출력(원소별 함수 적용)
f2 = lambda x : '%.2f' % x # 포맷 변경
data['30대'] = data['30대'].map(f2) # 특정 컬럼의 원소별 적용 시 map 메서드 사용
data.applymap(f2) # 전체 데이터의 원소별 적용 시 applymap 메서드 사용
### 4. 연도별 실업율 총 합
data.apply(sum,1)
2000년 19.4
2001년 17.6
2002년 14.6
2003년 16.1
2004년 16.8
2005년 17.4
2006년 16.6
2007년 15.8
2008년 15.4
2009년 18.1
2010년 19.2
2011년 17.7
2012년 17.2
2013년 16.7
dtype: float64
### 5. 연령대별 실업율 평균
round(data.apply(np.mean, axis = 0),2)
20대 7.51
30대 3.21
40대 2.37
50대 2.31
60세이상 1.64
dtype: float64
### 6. 60세 이상 컬럼 제외
data.drop('60세이상', axis = 1)
#. Q2
### disease.txt 파일 불러오기
data = DataFrame(np.loadtxt('disease.txt', dtype = 'str'))
data.dtypes
0 object
1 object
2 object
3 object
4 object
5 object
dtype: object
### 데이터 전처리
data.columns = data.iloc[0] # 첫 행을 column name으로
data = data.drop(0)
data.index = data.iloc[:,0] # 첫 열을 row name으로
data = data.drop('월별', axis = 1)
data.columns.name = '병명' # column name 설정
f1 = lambda x : x.replace('NA', '0') # NA값을 0으로 치환 / lambda x : 0 if x == 'NA' else x
data = data.applymap(f1)
f2 = lambda x : int(x.replace(',','')) # 천 단위 구분기호 치환
data = data.applymap(f2)
data.dtypes
병명
콜레라 int64
장티푸스 int64
이질 int64
대장균 int64
A형간염 int64
dtype: object
### 1. 월별 발병건수의 총 합
data.apply(sum,axis = 1)
월별
1월 1089
2월 967
3월 1217
4월 1564
5월 1524
6월 1522
7월 1248
8월 1129
9월 515
10월 519
11월 694
12월 1225
dtype: int64
### 2. 질병별 발병건수의 평균
data.apply(np.mean,axis = 0)
병명
콜레라 3.500000
장티푸스 152.333333
이질 349.916667
대장균 49.416667
A형간염 545.916667
dtype: float64
### 3. 전체 데이터를 4자리 표현식으로 출력
f3 = lambda x : '%04d'%x
data.applymap(f3)
### 4. index 이름(row name)에서 "월" 제거
f4 = lambda x : x.replace('월','')
data.index = data.index.map(f4)
data
### card_history.csv 파일 로딩 후
card = pd.read_csv('card_history.csv', encoding='cp949')
card
### 1) NUM컬럼의 값을 index(row이름)로 설정
card = card.set_index('NUM') # set_index 메서드를 사용하면 원본에서 컬럼을 제거할 필요가 없음
card # card = card.drop('NUM',axis=1)
### 2) 모든 컬럼 숫자 형태 변환
f1 = lambda x : int(x.replace(',',''))
card = card.applymap(f1)
card
### 3) 의복 지출이 큰 순서대로 정렬
card.sort_values(by='의복', ascending=False)
### 4) 각 일수별로 각 소비형태가 차지하는 비율 출력
f2 = lambda x : round(x / x.sum() * 100, 2)
card.apply(f2, axis=1)
'Python > Process' 카테고리의 다른 글
[Python] DataFrame의 멀티인덱스와 멀티컬럼(Multi-index, Multi-column) (8) | 2019.02.12 |
---|---|
[Python] Pandas - DataFrame 관련 메서드 (0) | 2019.02.11 |
[Python] Pandas - DataFrame (0) | 2019.02.08 |
[Python] profile 만들기 (import를 한 번에) (0) | 2019.02.07 |
[Python] Pandas - Series (0) | 2019.02.07 |