티스토리 뷰

반응형



# 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




#. Q3

### 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)





반응형
댓글
최근에 올라온 글
최근에 달린 댓글
링크
Total
Today
Yesterday