1. Intro

그동안 배운 것은 행과 열, 특정 조건을 만족하는 데이터만 조회하는 것을 다루었다. 이번시간에는 조금 함수를 활용하여 데이터를 가공하는 법을 알려드리고자 한다.

 

만약, 판다스 기초적인 부분부터 확인 하고 싶다면 아래 글들을 차례대로 해보기를 권한다. 

 


 

2019/10/30 - [Python/[Python] 데이터 전처리] - [Python] 판다스 자료 구조 - Series

 

[Python] 판다스 자료 구조 - Series

Intro 파이썬의 수많은 라이브러리 중, 엑셀데이터를 수집하고 정리하는 데 최적화된 도구가 판다스 라이브러리라고 볼 수 있다. 판다스를 배우면 데이터과학의 80~90% 업무를 처리할 수 있고, 데이터과학자에게..

cozydatascientist.tistory.com

2019/11/04 - [Python/[Python] 데이터 전처리] - [Python] 판다스 자료 구조 - 데이터프레임

 

Pandas Dataframe

데이터프레임은 2차원 배열의 행과 열로 구성되어져 있다. 대부분의 사람들이 알고 있는 마이크로소프트사의 EXCEL, SQL Table 등을 생각하면 데이터프레임을 쉽게 이해할 수 있다. 판다스에서 가장 많이 사용되는 객체이며, 실제 파이썬을 활용한 데이터 분석을 하고 싶다면 필수적으로 알아야 하는 내용이다. 기본적으로 Python은 행렬 연산에 최적화된 언어라고 할 수 있지만, 판다스 라이브러리는 R의 데이터프레임에서 유래했다고 알려져 있다. 여기서 잠깐

chloevan.github.io

 

[Python] 판다스 자료 구조 - 데이터프레임

데이터프레임은 2차원 배열의 행과 열로 구성되어져 있다. 대부분의 사람들이 알고 있는 마이크로소프트사의 EXCEL, SQL Table 등을 생각하면 데이터프레임을 쉽게 이해할 수 있다. 판다스에서 가장 많이 사용되는..

cozydatascientist.tistory.com

2019/11/08 - [Python/[Python] 데이터 전처리] - [파이썬] 판다스 활용 데이터 전처리 - 열 다루기

 

[파이썬] 판다스 활용 데이터 전처리 - 열 다루기

1. Intro 지금까지 배운 것은 데이터프레임으로 변환하는 내용이었다. 데이터프레임으로 변환한다는 뜻은 결과적으로 연구자 또는 분석 요건에 맞춰서 데이터를 가공할 줄 알아야 한다. Pandas를 배우는 궁극적인..

cozydatascientist.tistory.com

2019/11/12 - [Python/[Python] 데이터 전처리] - [파이썬] 판다스 활용 데이터 전처리 - 행 다루기

 

[파이썬] 판다스 활용 데이터 전처리 - 행 다루기

1. Intro 지난 시간에는 열(=Column)을 다루는 것을 배웠다. 구체적으로는 열을 선택하는 방법, 추가하는 방법, 삭제하는 방법을 배웠다. 이번에는 행을 다루는 것을 배워보도록 해보자. [지난 글] 2019/11/12 - [..

cozydatascientist.tistory.com

2019/11/15 - [분류 전체보기] - [파이썬] 판다스를 활용한 행과 열 동시에 다루기

 

[파이썬] 판다스를 활용한 행과 열 동시에 다루기

이번 시간에는 지난시간에 기본적인 내용에서 실무에서 주로 사용하는 iloc와 loc를 활용해서 행과 열을 동시에 다루는 법에 대해 알려준다. 2019/11/08 - [Python/[Python] 데이터 전처리] - [파이썬] 판다스 활..

cozydatascientist.tistory.com


2. Data Transformation(데이터 가공)

이번에는 기상 데이터를 활용할 것이며, 마찬가지로 데이터는 DataCamp를 통해서 수집하였다. 

import pandas as pd
url = 'https://assets.datacamp.com/production/repositories/502/datasets/6c4984cb81ea50971c1660434cc4535a6669a848/pittsburgh2013.csv'
weather = pd.read_csv(url)
weather.shape
weather.head()

총 365개의 행과 23개의 변수로 이루어진 데이터셋을 확인해보자. 참고적으로 위 데이터는 `Pittsburgh` 2013년 기상 데이터로 확인된다. 사용자 정의 함수를 만들고, 데이터의 칼럼 변환시 참고하도록 해보자. 

 

2.1 apply()

먼저 `.apply()`함수를 이용해보자. 

사용자 정의 함수를 작성한 후, 적용하는 소스코드다. 사용자 정의 함수는 화씨 온도단위를 섭씨 온도단위로 바꾸는 것이다.  이 때 변환하려는 변수는 `Mean TemperatureF`와 `Mean Dew PointF`이다. 

def to_celsius(F):
return 5/9*(F-32)
df_celsius = weather[['Mean TemperatureF', 'Mean Dew PointF']].apply(to_celsius)
df_celsius.columns = ['Mean TemperatureC', 'Mean Dew PointC']
print(df_celsius.head())
Mean TemperatureC Mean Dew PointC
0 -2.222222 -2.777778
1 -6.111111 -11.111111
2 -4.444444 -9.444444
3 -2.222222 -7.222222
4 -1.111111 -6.666667

한국사람에게 친숙한 겨울철 영하온도가 기록되는 것을 확인할 수 있다. 

2.2 map()

`.map()`함수를 사용하려면 데이터 전체보다는 Series 타입에서만 사용해야만 한다. 좀 더 쉽게 표현하면 한 변수에 대해서만 적용이 가능하다는 뜻이다. 이번에는 election 데이터를 활용하도록 한다. 

import pandas as pd
url = 'https://assets.datacamp.com/production/repositories/502/datasets/502f4eedaf44ad1c94b3595c7691746f282e0b0a/pennsylvania2012_turnout.csv'
election = pd.read_csv(url, index_col = "county")
election.head()

winner 변수를 활용해서 새로운 변수 group를 만들 것이다. Romney에 해당하면 A Obama에 해당하면 B 이렇게 적용할 것이다. 보통 이런 경우에는 조건문 if() 함수가 떠오르겠지만, .map() 함수를 사용하면 보다 쉽게 데이터를 변환할 수 있다.

A_B = {'Romney' : 'A', 'Obama' : 'B'}
election['group'] = election.winner.map(A_B)
print(election.head())
state total Obama Romney winner voters turnout \
county
Adams PA 41973 35.482334 63.112001 Romney 61156 68.632677
Allegheny PA 614671 56.640219 42.185820 Obama 924351 66.497575
Armstrong PA 28322 30.696985 67.901278 Romney 42147 67.198140
Beaver PA 80015 46.032619 52.637630 Romney 115157 69.483401
Bedford PA 21444 22.057452 76.986570 Romney 32189 66.619031
margin group
county
Adams 27.629667 A
Allegheny 14.454399 B
Armstrong 37.204293 A
Beaver 6.605012 A
Bedford 54.929118 A

위에서 볼 수 있는 것처럼 group 변수가 생겼고, Romney와 Obama에 매칭되는 A, B값이 들어간 것을 확인할 수 있다.

2.3 vectorized functions()

 

from scipy.stats import zscore
turnout_zscore = zscore(election['turnout'])
election['turnout_zscore'] = turnout_zscore
print(election.head())
state total Obama Romney winner voters turnout \
county
Adams PA 41973 35.482334 63.112001 Romney 61156 68.632677
Allegheny PA 614671 56.640219 42.185820 Obama 924351 66.497575
Armstrong PA 28322 30.696985 67.901278 Romney 42147 67.198140
Beaver PA 80015 46.032619 52.637630 Romney 115157 69.483401
Bedford PA 21444 22.057452 76.986570 Romney 32189 66.619031
margin group turnout_zscore
county
Adams 27.629667 A 0.853734
Allegheny 14.454399 B 0.439846
Armstrong 37.204293 A 0.575650
Beaver 6.605012 A 1.018647
Bedford 54.929118 A 0.463391

z점수는 표준점수로 이해하면 된다. 양수가 나왔다면 평균보다 상위에 있는 것이고, 음수가 나왔다면 평균보다 하위에 위치에 있다는 뜻이다.

 

지금까지 판다스의 기본을 다루었다. 

 

다음시간에는 인덱싱 다루는 법에 공유하겠다. 

이번 시간에는 지난시간에 기본적인 내용에서 실무에서 주로 사용하는 iloc와 loc를 활용해서 행과 열을 동시에 다루는 법에 대해 알려준다.

 

2019/11/08 - [Python/[Python] 데이터 전처리] - [파이썬] 판다스 활용 데이터 전처리 - 열 다루기

 

[파이썬] 판다스 활용 데이터 전처리 - 열 다루기

1. Intro 지금까지 배운 것은 데이터프레임으로 변환하는 내용이었다. 데이터프레임으로 변환한다는 뜻은 결과적으로 연구자 또는 분석 요건에 맞춰서 데이터를 가공할 줄 알아야 한다. Pandas를 배우는 궁극적인..

cozydatascientist.tistory.com

2019/11/12 - [Python/[Python] 데이터 전처리] - [파이썬] 판다스 활용 데이터 전처리 - 행 다루기

 

[파이썬] 판다스 활용 데이터 전처리 - 행 다루기

1. Intro 지난 시간에는 열(=Column)을 다루는 것을 배웠다. 구체적으로는 열을 선택하는 방법, 추가하는 방법, 삭제하는 방법을 배웠다. 이번에는 행을 다루는 것을 배워보도록 해보자. [지난 글] 2019/11/12 - [..

cozydatascientist.tistory.com

먼저 데이터는 2012년 미국 민주당 경선 데이터를 참고하였다. 데이터 코드는 DataCamp에서 제공 받았다. 데이터를 가져와서 확인해보자.

import pandas as pd
url = 'https://assets.datacamp.com/production/repositories/502/datasets/502f4eedaf44ad1c94b3595c7691746f282e0b0a/pennsylvania2012_turnout.csv'
election = pd.read_csv(url, index_col = "county")
election.head()

loc와 iloc 차이점

loc와 iloc의 차이점은 변수 선택을 숫자로 하는 것인가? 아니면 문자로 지정하는 것인가? 하는 차이점이다. Allegheny county에서 승리한 Obama를 추출하는 코드를 만들 예정이며, loc와 iloc 모두 사용하도록 한다. 

먼저 loc를 사용해보자. 

election.loc['Allegheny', 'winner']
---
'Obama'

 

Obama가 정상적으로 추출된 것을 확인할 수 있다. 다음은 iloc를 사용하여 추출해보자. 이때는 행과 열 숫자를 입력해야 한다. 0부터 count가 된다는 것을 잊지 말아야 한다.

 

election.iloc[1, 4]
---
'Obama'

마찬가지로 Obama가 정상적으로 추출된 것을 확인할 수 있을 것이다.

 

Column 선택 및 재정렬

분석목적에 따라 Column을 재정렬 해야 할 필요가 있다. Column을 추출하는데 있어서, winner, total 순서대로 재출해보자. 

results = election[['winner', 'total']]
results.head(10)

 

위 데이터를 통해서 보다 깔끔하게 정리된 데이터를 확인할 수 있다.

슬라이싱을 활용한 행과 열 다루기

원소 데이터를 선택할 때, 범위를 지정하여 슬라이싱하는 방법을 여러 가지로 응용할 수 있다.  

DataFrame객체.iloc[시작인덱스:끝인덱스:슬라이싱 간격]

 

슬라이싱의 범위는 '시작 인덱스'를 포함하며, '끝 인덱스'보다 1이 작은 인덱스까지 포함한다. 이 때, "슬라이싱 간격"을 지정하지 않으면 자동적으로 1씩 증가한다.

 

슬라이싱을 활용한 행 다루기

시작인덱스는 'Blair', 끝인덱스는 'Butler'로 지정하자. 

p_counties = election.loc['Perry':'Potter']
print(p_counties)

p_counties_rev = election.loc['Potter':'Perry':-1]
p_counties_rev

슬라이싱을 활용한 열 다루기

이번에는 전체 행을 조회하지만, 열은 처음부터 `Obama`까지만 추출하도록 하는 코드를 실행해보자. 

to_Obama = election.loc[:, :'Obama']
print(to_Obama.head())
state total Obama
county
Adams PA 41973 35.482334
Allegheny PA 614671 56.640219
Armstrong PA 28322 30.696985
Beaver PA 80015 46.032619
Bedford PA 21444 22.057452

이번에는 Obama부터 모든 열을 추출하도록 해보자.

Obama_to_end = election.loc[:, 'Obama':]
Obama_to_end.head()

이번에는 Obama부터 Voters까지 열을 조회하도록 해보자.

Obama_to_Voters = election.loc[:, 'Obama':'voters']
print(Obama_to_Voters.head())
Obama Romney winner voters
county
Adams 35.482334 63.112001 Romney 61156
Allegheny 56.640219 42.185820 Obama 924351
Armstrong 30.696985 67.901278 Romney 42147
Beaver 46.032619 52.637630 Romney 115157
Bedford 22.057452 76.986570 Romney 32189

슬라이싱을 통한 행과 열 부분 추출

거의 종착역에 다 왔다. 이번에는 그동안 배운 슬라이싱을 통해 행과 열을 동시에 추출해보자. 

subselected_election = election.loc['Potter':'Perry':-1, 'Obama':'voters']
print(subselected_election)
Obama Romney winner voters
county
Potter 26.259542 72.158223 Romney 10913
Pike 43.904334 54.882576 Romney 41840
Philadelphia 85.224251 14.051451 Obama 1099197
Perry 29.769737 68.591009 Romney 27245

 

1. Intro

지난 시간에는 열(=Column)을 다루는 것을 배웠다. 구체적으로는 열을 선택하는 방법, 추가하는 방법, 삭제하는 방법을 배웠다. 이번에는 행을 다루는 것을 배워보도록 해보자. 


[지난 글]

2019/11/12 - [Python/[Python] 데이터 전처리] - [파이썬] 판다스 활용 데이터 전처리 - 행 다루기


우선 지난 챕터와 마찬가지로 연습용 데이터를 만들어보도록 하자. 학생들의 이름을 변수로 추가하도록 한다. 

import pandas as pd
exam_dic = {'이름' : ['Evan', 'Chloe', 'Alice', 'John'],
'국어' : [80, 70, 90, 87],
'영어' : [100, 80, 50, 90],
'수학' : [85, 75, 65, 100],
'과학' : [89, 67, 90, 85]}
data = pd.DataFrame(exam_dic)
print(data)
이름 국어 영어 수학 과학
0 Evan 80 100 85 89
1 Chloe 70 80 75 67
2 Alice 90 50 65 90
3 John 87 90 100 85

 

2. 행 다루기

행을 다루는 방법은 여러가지가 있는데, 대표적으로 말하면 크게 3가지가 존재한다. 
- 행 선택(Selection)
- 행 추가(Addition)
- 행 삭제(Deletion)

이제 본격적으로 차례대로 하나씩 진행하도록 해본다.

2.1 행 선택

판다스에서 행을 선택하는 방법은 loc[]을 사용한다. 먼저 `loc[]`을 사용하여 Chloe을 선택 해보자.

data.loc[1]
이름 Chloe
국어 70
영어 80
수학 75
과학 67
Name: 1, dtype: object

이번에는 Alice를 선택해보자. 

data.loc[2]
이름 Alice
국어 90
영어 50
수학 65
과학 90
Name: 2, dtype: object

위 데이터의 문제점은 이름으로 행을 추출하는 것이 아니라 숫자로 선택해야 한다는 점이다. 데이터가 많아지면 특정행을 추출하기가 매우 어려워지기 때문에 데이터에 '이름'열을 새로운 인덱스로 지정하겠다. 이 때에는 set_index('새로운_인덱스_열', inplace=True)을 추가하면 된다.

data.set_index('이름', inplace=True)
print(data)
국어 영어 수학 과학
이름
Evan 80 100 85 89
Chloe 70 80 75 67
Alice 90 50 65 90
John 87 90 100 85

이름이 새로운 인덱스로 변환된 것을 확인할 수 있다. 이제 다시 ChloeAlice를 선택해본다.

data.loc['Chloe']
국어 70
영어 80
수학 75
과학 67
Name: Chloe, dtype: int64
data.loc['Alice']
국어 90
영어 50
수학 65
과학 90
Name: Alice, dtype: int64

만약 2개 이상의 행을 선택하고 싶다면 data.loc[['행이름1', '행이름2', ..., '행이름N']]와 같은 형태로 지정하면 이번에는 시리즈 객체가 아닌 데이터프레임으로 반환한다. 

Chloe와 Alice를 동시에 선택하도록 해본다. 코드로 확인해보자. 

data.loc[['Chloe', 'Alice']]
국어 영어 수학 과학
이름
Chloe 70 80 75 67
Alice 90 50 65 90

위에서 보는 것처럼 데이터프레임으로 반환된 것을 볼 수 있다. 범위 슬라이싱과 같은 고급 기술도 있지만, 이 부분은 실무 데이터와 함께 적용하는 것으로 일단 남겨둔다. 

2.2 행 추가
열을 추가하는 것은 엑셀을 쉽게 떠올리면 매우 쉽다. 간단하게 문법을 소개하면 data['새로운 행 이름'] = 데이터 값 와 같으며, 이 때 데이터 값을 잘 다뤄야 한다. 

이번에는 Chris라는 학생을 추가하도록 해본다. 이 때 주의해야 하는 점은 새로운 행을 추가할 때는 data.loc['새로운_인덱스_이름']으로 시작해야 한다는 점이다. 그리고, 입력값의 열의 이름이 동일한지 확인해봐야 한다. 

data.loc['Chris'] = [90, 85, 80, 50]
print(data)
국어 영어 수학 과학
이름
Evan 80 100 85 89
Chloe 70 80 75 67
Alice 90 50 65 90
John 87 90 100 85
Chris 90 85 80 50

약에 새로운 데이터프레임이 있다고 한다면 어떻게 합쳐야 할까? 이 때에는 pandas.concat([data, new_row])과 같은 형태로 진행하면 된다. 두개 Row가 있는 데이터프레임을 만든 후 행을 합치는 것을 진행해보겠다.

exam_dic2 = {'국어' : [80, 70],
'영어' : [100, 80],
'수학' : [85, 75],
'과학' : [89, 67]}
new_row = pd.DataFrame(exam_dic2, index=['대한이', '민국'])
data2 = pd.concat([data, new_row])
print(data2)
국어 영어 수학 과학
Evan 80 100 85 89
Chloe 70 80 75 67
Alice 90 50 65 90
John 87 90 100 85
Chris 90 85 80 50
대한이 80 100 85 89
민국 70 80 75 67

2.3 행 삭제
행을 삭제하는 방법은 drop함수를 사용하는 방법이다. drop 함수를 사용 시, 각 행의 이름 또는 위치 숫자를 입력하여 제거하면 된다. Evan과 Chloe 행을 제거해보자.

data.drop(["Evan", "Chloe"], inplace = True)
data
국어 영어 수학 과학
이름
Alice 90 50 65 90
John 87 90 100 85
Chris 90 85 80 50

지금까지 데이터프레임의 행(=Row)을 다루는 가장 기본적인 과정을 다루었다. 물론, 실무에서는 고급기술이 더 많이 사용되기는 하지만, 언제나 기초가 중요하기 때문에 기본적인 함수의 사용법에 대해 익히기를 바란다. 

 

다음 시간에는 행과 열을 동시에 사용하여 데이터를 다루는 방법을 배우도록 하겠다.

 

 

 

 

 

 

 

 

 

 

1. Intro

지금까지 배운 것은 데이터프레임으로 변환하는 내용이었다. 데이터프레임으로 변환한다는 뜻은 결과적으로 연구자 또는 분석 요건에 맞춰서 데이터를 가공할 줄 알아야 한다. Pandas를 배우는 궁극적인 목적이기도 하다. 

 


혹시 데이터프레임에 관한 기본 지식이 필요한 분들은 아래 글을 방문하시기를 바란다. 

https://chloevan.github.io/python/pandas/pandas_dataframe/


기본적으로 딕셔너리를 다뤘던 내용과 거의 유사하기 때문에 주의 깊게 살펴보기를 바란다. 
우선, 데이터프레임을 만들도록 하겠다. 

import pandas as pd
exam_dic = {'국어' : [80, 70, 90, 87], "영어" : [100, 80, 50, 90],
'수학' : [85, 75, 65, 100], "과학" : [89, 67, 90, 85]}
data = pd.DataFrame(exam_dic, index = ['Evan', 'Chloe', 'Alice', 'John'])
print(data)
국어 영어 수학 과학
Evan 80 100 85 89
Chloe 70 80 75 67
Alice 90 50 65 90
John 87 90 100 85

2. 열 다루기

열을 다루는 방법은 여러가지가 있는데, 대표적으로 말하면 크게 3가지가 존재한다. 
- 열 선택(Selection)
- 열 추가(Addition)
- 열 삭제(Deletion)

이제 본격적으로 차례대로 하나씩 진행하도록 해본다.

2.1 열 선택

기본적으로 열을 선택할 때에는 data[' '] 열의 이름을 입력하거나 또는 dot (.) 를 활용한 방법(ex: data.열이름) 두 가지 방식이 있다. 이 때 주의해야 하는 것은 열 1개만 선택하면 시리즈로 반환한다. 

 

data['국어']
Evan 80
Chloe 70
Alice 90
John 87
Name: 국어, dtype: int64
data.국어
Evan 80
Chloe 70
Alice 90
John 87
Name: 국어, dtype: int64

만약 2개 이상의 열을 선택하고 싶다면 data[['열이름1', '열이름2', ..., '열이름N']]와 같은 형태로 지정하면 이번에는 시리즈 객체가 아닌 데이터프레임으로 반환한다. 

 

코드로 확인해보자.

data[['국어', '과학']]
국어 과학
Evan 80 89
Chloe 70 67
Alice 90 90
John 87 85

 

2.2. 열 추가

열을 추가하는 것은 엑셀을 쉽게 떠올리면 매우 쉽다. 간단하게 문법을 소개하면 data['새로운 열 이름'] = 데이터 값 와 같으며, 이 때 데이터 값을 잘 다뤄야 한다. 우선 언어영역합계, 수리영역합계라는 열 이름을 추가하도록 하겠다.

data['언어영역합계'] = data['국어'] + data['영어']
print(data)
국어 영어 수학 과학 언어영역합계
Evan 80 100 85 89 180
Chloe 70 80 75 67 150
Alice 90 50 65 90 140
John 87 90 100 85 177
data['수리영역합계'] = data['수학'] + data['과학']
print(data)
국어 영어 수학 과학 언어영역합계 수리영역합계
Evan 80 100 85 89 180 174
Chloe 70 80 75 67 150 142
Alice 90 50 65 90 140 155
John 87 90 100 85 177 185

이번에는 수업태도점수를 모두 10점을 준다고 가정을 하고 일괄적으로 처리하도록 해보자. 코드는 다음과 같다.

data['수업태도점수'] = 10
print(data)
국어 영어 수학 과학 언어영역합계 수리영역합계 수업태도점수
Evan 80 100 85 89 180 174 10
Chloe 70 80 75 67 150 142 10
Alice 90 50 65 90 140 155 10
John 87 90 100 85 177 185 10

2.3 열 삭제

열을 삭제하는 방법은 크게 3가지 방법이 있다. 
- del을 사용하는 방법
- pop을 사용하는 방법
- drop을 사용하는 방법

먼저 del을 사용하는 방법이다. 먼저 수업태도점수를 삭제한다.

del data['수업태도점수']
print(data)
국어 영어 수학 과학 언어영역합계 수리영역합계
Evan 80 100 85 89 180 174
Chloe 70 80 75 67 150 142
Alice 90 50 65 90 140 155
John 87 90 100 85 177 185

다음은 pop을 사용하여 수리영역합계를 삭제한다.

data.pop('수리영역합계')
print(data)
국어 영어 수학 과학 언어영역합계
Evan 80 100 85 89 180
Chloe 70 80 75 67 150
Alice 90 50 65 90 140
John 87 90 100 85 177

마지막으로 drop을 사용하여 언어영역합계를 삭제한다. 다만, 이 때는 axis=1과 inplace=True라는 옵션을 사용한다. 뜻은 data객체를 변경하여 열을 삭제한다는 뜻이다. 참고로 axis=0으로 설정할 경우 행 또는 인덱스 배열을 삭제한다는 뜻이다.

data.drop('언어영역합계', axis=1, inplace=True)
print(data)
국어 영어 수학 과학
Evan 80 100 85 89
Chloe 70 80 75 67
Alice 90 50 65 90
John 87 90 100 85

지금까지 데이터프레임의 열(=Column)을 다루는 가장 기본적인 과정을 다루었다. 물론, 실무에서는 고급기술이 더 많이 사용되기는 하지만, 언제나 기초가 중요하기 때문에 기본적인 함수의 사용법에 대해 익히기를 바란다.

 

도움이 되었기를 바랍니다. 

+ Recent posts