목차


이번 글은 Python에 익숙해지기 위해 간단한 함수 등을 다뤄보는 내용입니다. 여기부터 자료 구조까지 Part 1 이고 numpy, pandas 등 모듈을 활용하여 데이터 분석 모델에 직접 입력하기 전 데이터를 전처리하는 부분은 Part 2로 나누었습니다.


모듈 불러오기


R에서 본인의 사용목적에 따라 패키지(Package)를 설치하고 라이브러리(Library)를 불러오듯이 Python 또한 이런 과정이 필요합니다. 데이터 분석에 필요한 기본적인 모듈(Module)은 아나콘다에 이미 설치가 되어 있기 때문에 새로운 모듈을 설치하는 것은 이후에 다루도록 하고 우선은 모듈을 불러오는 문법을 간단히 언급하고자 합니다. 예를 들어 pandas 라는 이름의 모듈을 불러온다고 하면

import pandas

을 하면 자신이 필요한 모듈을 라이브러리 불러오듯이 불러올 수 있습니다. 그리고 불러온 모듈에 내장된 함수를 사용하는 방법은 아래와 같습니다. 위에서 불러온 pandas 모듈에 있는 DataFrame이라는 함수를 사용하면

pandas.DataFrame(변수명)

이런 식으로 사용하면 됩니다.


함수와 메서드

Python에는 SQL이나 R에서는 볼 수 없는 형태의 함수가 있습니다. 메서드(Method)라는 개념인데 함수는 보통 함수 이름을 입력하고 괄호 안에 모든 변수를 넣는데 메서드는 가장 앞에 변수를 적고 .(마침표)를 찍은 후 메서드의 이름을 적고 나머지 변수를 괄호 안에 넣는 방식입니다.

예를 들어 data라는 변수에 fuction을 각각 적용하는 문법은 아래 표와 같습니다.

함수(function) 메소드(method)
function(data, …) data.function(…)


Python에서 함수를 사용할 때 주의할 점이 있는데 같은 기능을 가진 함수, 메소드 양쪽 모두 구현되어 있는 경우도 있으나 한 쪽만 구현되어 있는 경우도 있으니 자신이 쓰는 함수가 어떤건지는 알아둘 필요가 있습니다.


isupper의 경우 메소드는 있지만 함수는 없다.


둘의 차이는 이 외에도 클래스(Class)에 종속 여부 또한 있지만 분석에 필요한 개념은 아니기 때문에 문법 차이 외의 개념에 대해서 더 궁금하신 분들은 메소드 vs 함수​로 구글링하시면 추가 정보를 얻으실 수 있습니다.



Python에 익숙해지기 위해 간단한 함수 몇 개를 추가적으로 다루어봅시다. 우선 spyder에서 코드를 실행하는 방법은 f9를 누르는 것입니다. 커서가 올라가 있는 줄의 코드가 실행이 되며 여러 줄의 코드를 동시에 실행하고 싶을 때는 실행할 코드를 모두 블록 지정한 뒤 f9를 누르면 됩니다.

Print

print 함수는 프로그래밍을 안 해본 사람도 어디선가 들어봤을 정도로 다른 프로그래밍 언어에서도 잘 쓰이는 유명한 함수입니다. 입력값에 대해 원하는 형태(포맷/format)에 맞춰서 출력해주는 함수입니다. 간단한 예제를 통해 알아보도록 합시다.

입력 값 출력 형식
print(1) 1
print(‘%d’ % 1) 1
print(‘%.2f’ % 10) 10.00
print(‘%5.2f’ % 10) 10.00
print(‘%s’ % ‘abcde’) abcde
print(‘%02d’ % 1) 01
print(‘%d + %d = %d’ % (1,2,3)) 1 + 2 = 3

순서대로 설명하자면, 포맷없이 숫자를 print에 넣으면 그대로 출력됩니다. 문자의 경우 따옴표를 붙이지 않으면 변수로 인식하기 때문에 제대로 실행이 되지 않으니 주의합시다.

그 밑으로는 print('포맷' % 변수 ) 식의 문법으로 되어 있는데 각각에 대해 표로 다시 정리해보겠습니다.

포맷 설명
‘%d’ 정수 출력
’%.2f’ 소숫점 2자리까지 출력(자동 반올림)
‘%5.2f’ 총 5자리 출력, 소숫점 2자리만 출력
‘%02d’ 총 2자리 출력, 자릿수 부족시 0으로 채워서 출력
‘%s’ 글자 그대로 출력

여기까지는 값 하나를 포맷에 맞춰 출력하는 문법에 대해 알아보았습니다. 다음으로는 상단 표에서 가장 아래에 있는 '%d + %d = %d' % (1,1,2)에 대해 설명드리겠습니다. 이 입력값은 다른 입력과 다르게 변수 부분이 소괄호로 묶여있습니다. 뜻은 괄호 내에 있는 변수를 좌측부터 우측 순서대로 왼쪽 포맷에 맞춰서 출력한다는 것입니다. 그렇기 때문에 가장 좌측에 있는 1이 맨 앞에 출력되었고 다음 변수인 2가 + 뒤에 출력 되고 마지막 변수인 3이 = 뒤에 출력이 되는 것입니다.


다음으로는 이스케이프 문자에 대해 알아보겠습니다. print함수는 포맷에 특정 문자를 입력하면 그것을 포맷 형식으로 인식하고 변수를 그 포맷에 맞춰 출력하게 되는데 입력 값의 포맷에 문자를 넣을 때 이를 포맷 형식으로 인식시키지 않고 그대로 출력시켜주는 것을 도와주는 것이 이스케이프 문자입니다. 위에서 포맷 중에 %d가 있는데 print 함수로 출력시에 %d 위치에 변수가 출력되는 것이 아닌 %d 그대로 출력하고 싶은 경우를 예로 들 수 있겠습니다.

이스케이프 문자 역할 설명
\n 새로운 줄로 이동 `Enter` 누른 효과
\t 다음 탭으로 이동 `Tab`을 누른 효과
\b 뒤로 한 칸 이동 `Backspace`를 누른 효과
\\ \ 출력
\' ' 출력
%% % 출력


이런 식으로 이스케이프 문자를 알고 있으면 원하는 형태로 출력시 문법 오류가 발생하지 않습니다. 위 표에서 %%라는 이스케이프 문자를 몰랐다면 변수 12를 넣어서 1 % 2라는 값을 출력할 때 print('%d %% %d' % (1,2))라고 하지 않고 print('%d % %d' % (1,2))라고 작성하고도 오류가 나고도 무엇이 문제인지 모를 것입니다.

print('%d % %d' % (1,2))
Traceback (most recent call last):

  File "<ipython-input-17-1159f7d66e65>", line 1, in <module>
    print('%d % %d' % (1,2))

ValueError: unsupported format character '%' (0x25) at index 5
이스케이프 문자 개념이 없는 경우 이런 상황이 발생




색인

색인은 특정 변수에서 원하는 부분은 출력하는 것을 의미하며 변수[위치값]의 형식으로 추출이 가능합니다. SQL이나 R에서는 위치의 시작이 1인데 반면, Python에서는 위치의 시작이 0, 1:2는 1에서 1까지(2의 이전인)를 의미합니다.

R과 또 다른 점이 있는데 문자열에서도 위치 색인이 가능하다는 것입니다. 한 글자 단위로 위치가 있다는 것인데, v1 = ‘abcdef’ 라는 변수를 예시로 사용해보도록 하겠습니다.

입력 출력 형식
v1[1] ‘b’
v1[1:2] ‘b’
v1[1:3] ‘bc’


이런 식으로 특정 문자에 대해서도 몇 번째부터 몇 번째까지 색인이 가능합니다.



연산

잠시 쉬어가는 차원에서 간단한 연산을 해보도록 하겠습니다.

연산 연산자
덧셈, 뺄셈 + , -
곱셈, 나눗셈 * , /
제곱 ** (^ 사용불가)

그런데 R과 차이점이 있는데 R에서는 벡터와 단일 값을 연산하면 벡터 연산이 지원이 되는데 Python에서는 벡터 연산을 지원하지 않습니다. R에서 하듯이 산술연산을 하다가 당황할 수 있습니다.

[1,2,3] + 1
Traceback (most recent call last):

  File "<ipython-input-25-e259f035f6b7>", line 1, in <module>
    [1,2,3] + 1

TypeError: can only concatenate list (not "int") to list32.343)
Out: 232


그리고 자기 자신에게 하는 연산에 있어 조금 간편한 방법이 있습니다. 사용하고 싶은 연산자=와 붙여서 사용하면 자기 자신을 두 번 언급하지 않으면서 연산이 가능합니다. 예를 들어 a = 3이라는 숫자가 있다고 할 때 a에 5를 더하고 싶을 때 보통 a = a + 5를 생각하실 수 있겠지만 a += 5로도 가능하다는 것입니다.


반올림은 round(숫자) 로 할 수 있습니다. 그리고 내림을 할때 문제가 있는데 trunc라는 함수가 기본 함수가 아니기 때문에 math 라는 모듈을 불러와서 실행을 해야합니다.

trunc(2.32)

Traceback (most recent call last):

  File "<ipython-input-18-827b1c8fca55>", line 1, in <module>
    trunc(2.32)

NameError: name 'trunc' is not defined


import math

math.trunc(232.343)
Out: 232
trunc는 기본 함수가 아님




문자열 메소드

이번에는 아래 문자열들을 이용하여 문자열 메소드에 대해 배워보도록 합시다.

a1 = 'abcde'

a2 = ' abc '

a3 = 'a;b;c'

1) startswith

R에서는 stringr패키지의 str_detect(a1, ‘[^prefix]‘)와 같은 역할을 하는 메소드로 문법은 아래와 같습니다.

a1.startswith(prefix,   - 시작값 확인 문자열
              start,    - 검사 시작 위치(생략가능)
              end)      - 검사  위치(생략가능)
예제 설명
a1.startswith(‘a’) ‘a’로 시작하는지 여부
a1.startswith(‘a’,1) a1[1:] (‘bcde’)가 ‘a’로 시작하는 여부

2) endswith

R에서는 str_detect(a1, ‘[prefix$]’)와 같은 역할을 하는 메소드로 startswith와 반대 역할을 합니다.

a1.endswith(suffix, - 끝값 확인 문자열
            start,  - 검사 시작 위치(생략가능)
            end)    - 검사  위치(생략가능)

예제 설명
a1.endswith(‘e’) a1이 ‘e’로 끝나는지 여부
a1.endswith(‘e’,1,3) a1[1:3]이 ‘e’로 끝나는지 여부
a1.endswith(‘c’,1,3) a1[1:3]이 ‘c’로 끝나는지 여부

3) strip

공백을 제거하는 메소드로 SQL에서는 trim에 해당합니다.

예제 설명
a2.lstrip() a2 왼쪽에서 공백 제거
a2.rstrip() a2 오른쪽에서 공백 제거
a2.strip() a2 양쪽에서 공백 제거

4) replace

치환 메소드로 R에서는 str_replace, SQL에서는 REPLACE가 있습니다.

예제 설명
a1.replace(‘a’,’A’) ‘a’를 ‘A’로 치환
a1.replace(‘a’,’’) ‘a’를 삭제

5) split
분리 메소드

a3.split(‘;’)

6) 대/소문자 치환

예제 설명
a1.upper() 소문자로
a1.lower() 대문자로
a1.title() 첫 글자만 대문자로

7) find

위칫값 메소드로 SQL의 INSTR함수와 동일합니다.

a1.find(‘a’) - a의 위치값

8) count

문자열 내에 괄호 안 문자가 몇 개 있는지 알려주는 메소드입니다.

a1.count(‘a’) - a의 포함횟수

9) format

괄호 안 변수를 앞 변수 형식에 맞춰 변환시켜주는 메소드입니다.

‘{0:d} + {1:d} = {2:.2f}’.format(1,2,3)




Python의 자료 구조에 들어가기 앞서서 워밍 업(warming up) 차원에서 간단한 함수들과 Python 언어의 특징을 다뤄보았습니다. 글 작성하면서 스스로도 정리가 되는 느낌이네요. 다음 포스트에는 Python의 자료 구조를 본격적으로 다뤄보도록 하겠습니다.

다음 내용

* 자료 구조

  • list
  • map
  • Series
  • tuple
  • dictionary

* 반복(제어)문

  • for
  • while
  • if
  • 제어문
  • 리스트 내포 표현식(List Comprehension)