Py-파이썬 기초

영은·2023년 9월 24일
0

데이터 전처리

목록 보기
1/10

1 파이썬의 기본 자료구조


1.1 데이터의 유형(type)

  • 수치형(Number) : 수치형 데이터, int, float, complex

    123, 123.45, (123+45j)

  • 문자열(String) : 문자 또는 문자의 집합

    'abc', "abc"

  • 리스트(List) : 다양한 타입의 데이터 목록

    ['abc', 123]

  • 튜플(Tuple) : 다양한 타입의 데이터 목록, 리스트와 유사하나 원소의 변경이 불가

    ('abc', 123)

  • 딕셔너리(Dictionary) : key:value 조합의 데이터

    {'name':'Youngeun', 'id':0831}

변수에 데이터를 배정(assignment)하고 유형 확인

x_value=12345
print(f'{x_value=}\n{type(x_value)=}')

👉 결과
x_value = 12345
type(x_value) = <class 'int'>

x_str = 'abcde' 
print(f'{x_str = }\n{type(x_str) = }')

👉 결과
x_str = 'abcde'
type(x_str) = <class 'str'>

x_list = [x_str, x_value] 
print(f'{x_list = }\n{type(x_list) = }')

👉 결과
x_list = ['abcde', 12345]
type(x_list) = <class 'list'>

x_tuple = (x_str, x_value)
print(f'{x_tuple=}\n{type(x_tuple)=}')

👉 결과
x_tuple=('abcde', 12345)
type(x_tuple)=<class 'tuple'>

x_dict = {'name': 'Youngeun', 'id':83100}
print(f'{x_dict=}\n{type(x_dict)=}')

👉 결과
x_dict={'name': 'Youngeun', 'id': 83100}
type(x_dict) = <class 'dict'>


1.2 mutable과 immutable

  • mutable : 배열에서 원소의 수정 가능한 자료형
    - 리스트(List), 딕셔너리(Ditionary)
  • immutable : 배열에서 원소의 수정이 불가능한 자료형
    - 문자열(String), 튜플(Tuple)

mutable: 리스트(List)

print(f'Before: {x_list = }')
x_list[1] = 'fghij'  # 인덱스 1 원소를 'fghij'로 변경
print(f'After : {x_list = }')

👉 결과
Before: x_list = ['abcde', 12345]
After : x_list = ['abcde', 'fghij']

mutable: 딕셔너리(Dictionary)

print(f'Before: {x_dict = }')
x_dict['name'] = 'Gildong Hong'  # 인덱스 1 원소를 'fghij'로 변경
print(f'After : {x_dict = }')

👉 결과
Before: x_dict = {'name': 'Youngeun', 'id': 83100}
After : x_dict = {'name': 'Gildong Hong', 'id': 83100}

immutable: 문자열 -> 원소 바꾸기 불가능

print(f'Before: {x_str = }')
x_str[1] = '2'  # 인덱스 1 원소를 '2'로 변경
print(f'After : {x_str = }')

👉 결과
Before: x_str = 'abcde'

TypeError: 'str' object does not support item assignment

immutable: 튜플 -> 원소 바꾸기 불가능

print(f'Before: {x_tuple = }')
x_tuple[1] = 'fghij'  # 인덱스 1 원소를 'fghij'로 변경
print(f'After : {x_tuple = }')

👉 결과
Before: x_tuple = ('abcde', 12345)

TypeError: 'tuple' object does not support item assignment


2 인덱싱과 슬라이싱


2.1 인덱싱(Indexing)

  • 배열에서 원소를 찾는 것
    - 인덱스는 0부터 시작하여 1씩 증가
    - 맨뒤 원소의 인덱스는 -1
  • 인덱싱한 결과는 원소의 유형을 따른다

인덱싱(Indexing)

x_dict['name']

👉 결과
'Gildong Hong'

print(f'{x_str = } \t\t==> {x_str[0] = }') # 0은 첫원소의 인덱스
print(f'{x_str = } \t\t==> {x_str[3] = }')
print(f'{x_list = } \t==> {x_list[0] = }')
print(f'{x_tuple = } \t==> {x_tuple[-1] = }') # -1은 마지막 원소의 인덱스
print(f'{x_dict = } \t==> {x_dict["name"] = }') # dictionary는 key로 인덱싱

👉 결과
x_str = 'abcde' ==> x_str[0] = 'a'
x_str = 'abcde' ==> x_str[3] = 'd'
x_list = ['abcde', 'fghij'] ==> x_list[0] = 'abcde'
x_tuple = ('abcde', 12345) ==> x_tuple[-1] = 12345
x_dict = {'name': 'Gildong Hong', 'id': 83100} ==> x_dict["name"] = 'Gildong Hong'


2.2 슬라이싱(Slicing)

  • 배열에서 부분집합을 가져오는 것
    - i:j -> 인덱스 i에서 (j-1)까지
    - i: -> 인덱스 i에서 마지막까지
    - :j -> 인덱스 처음부터 (j-1)까지
    - : -> 인덱스 처음부터 끝까지
  • 슬라이싱한 결과는 원래의 type과 동일함

슬라이싱(Slicing)

print(f'{x_str = } \t\t==> {x_str[2:] = }')
print(f'{x_list = } \t==> {x_list[0:1] = }')
print(f'{x_tuple = } \t==> {x_tuple[0:1] = }')

👉 결과
x_str = 'abcde' ==> x_str[2:] = 'cde'
x_list = ['abcde', 'fghij'] ==> x_list[0:1] = ['abcde']
x_tuple = ('abcde', 12345) ==> x_tuple[0:1] = ('abcde',)


3 제어문


3.1 분기문(if-else)

  • 조건의 만족 여부에 따라 코드의 실행 경로를 변경하는 문장
    - 조건은 True 또는 False로 구분되는 문장
    - 파이썬은 indent로 문단을 구분함
if (조건 1):
    (실행문 1)
elif (조건 2): # 생략 및 추가 기능
    (실행문 2)
else:		  # 생략 가능
    (실행문 3)

if-else

money = 1000
if money <= 500:
  print('걸어간다.')
else:
  print('택시탄다.')

👉 결과
택시탄다.

if-elif-else

money = 1000
if money <= 500:
  print('걸어간다.')
elif money <= 2500:
  print('버스탄다.')
else:
  print('택시탄다.')

👉 결과
버스탄다.


3.2 반복문(while, for)

  • 조건을 만족하는 동안 코드블럭을 반복수행하는 문장
  • 파이썬은 indent로 문단을 구분함 (cf) C에서는 {}로 구분)

while문

조건변수 = 초기값
while (조건):
    조건변수 업데이트	(실행문)
n=0
while n < 5:
  n = n+1
  print("n=", n)

👉 결과
n= 1
n= 2
n= 3
n= 4
n= 5

for문

for 변수 in (유한한 변수의 값들):
    (실행문)
for n in range(0,6):
    print("n=", n)

👉 결과
n= 0
n= 1
n= 2
n= 3
n= 4
n= 5

for item in x_list:
  print(f'{item = }')

👉 결과
item = 'abcde'
item = 'fghij'

x = [10,20,30,40,50]
for method in [len, max, sum]:
    print(f'{method(x) = }')

👉 결과
method(x) = 5
method(x) = 50
method(x) = 150

enumerate() 함수를 이용한 for문

  • for문에서 인덱스를 사용하고자 할 때 사용
for item in enumerate(['a','b','c','d','e']):
   print(f'{item = }')

👉 결과
item = (0, 'a')
item = (1, 'b')
item = (2, 'c')
item = (3, 'd')
item = (4, 'e')

for i, item in enumerate(['a','b','c','d','e']):
    print(f'{i = }, {item = }')

👉 결과
i = 0, item = 'a'
i = 1, item = 'b'
i = 2, item = 'c'
i = 3, item = 'd'
i = 4, item = 'e'


3.3 함수

  • 인수(arguments)를 입력으로 받아 실행문(코드블럭)을 실행하고 출력(return)하는 하나의 실행 모듈
  • return은 튜플로 반환됨
  • 매개변수(parameter)는 함수에 입력으로 전달된 값을 받는 변수를 의미하고 인수(arguments)는 함수를 호출할 때 전달하는 입력 값을 의미함
def 함수명(매개변수):
    (실행문)
    return 변수

함수 정의

def minus(a,b): # a,b는 parameters
  result = a-b
  return result

함수의 활용

a = minus(3,7) # 3,7은 arguments
print(a)

👉 결과
-4


3.4 람다함수(익명함수)

  • 일반함수를 가볍게 만들어 사용하기 위한 함수

람다함수 정의

  • 람다 표현식(lambda expression) = 익명함수(anonymous function)
lambda 인자 : 표현식
lambda x : x+1

👉 결과
<function main.(x)>

  • 함수명을 지정하여 재사용 가능함
add_ten = lambda x: x + 10  
  • 람다함수의 사용
print((lambda x: x+1)(10))
print(add_ten(10))

👉 결과
11
20

  • 람다 표현식 안에서는 새 변수를 만들 수 없으나 밖의 변수는 사용가능함
y = 100
(lambda x: x+y+1)(10)

👉 결과
111

람다함수를 인자로 활용

  • map 함수에 적용
list(map(lambda x: x + 10, [1, 2, 3]))

👉 결과
[11, 12, 13]

  • 람다 표현식에 조건부 표현식 사용
a = range(10)
list(map(lambda x: 'str'+str(x) if x % 3 == 0 else x, a))

👉 결과
['str0', 1, 2, 'str3', 4, 5, 'str6', 7, 8, 'str9']

  • 람다 표현식에 복잡한 조건부 표현식 사용
a = range(10)
list(map(lambda x: 'str'+str(x) if x % 3 == 0 else float(x) if x % 3 == 1 else x, a))

👉 결과
['str0', 1.0, 2, 'str3', 4.0, 5, 'str6', 7.0, 8, 'str9']

  • 람다 표현식에 인자 여러개 넣기
a = range(10)
b = [100]*10     # 브로드캐스팅은 안됨
list(map(lambda x, y: x if x % 3 == 0 else x + y, a, b))

👉 결과
[0, 101, 102, 3, 104, 105, 6, 107, 108, 9]


4 모듈과 패키지


4.1 모듈

  • 함수나 변수 또는 클래스 들을 모아 놓은 파이썬 파일(.py)
  • 다른 파이썬 프로그램에서 불러와(import) 사용할 수 있음

모듈 만들기(my_module.py)

my_var = 'my_var'
def my_func():
    return 'my_func'
def _my_private_func():
    return 'my_private_func'

모듈 불러오기

import my_module as mm

print(mm.my_var)
print(mm.my_func())
print(mm._my_private_func())

👉 결과
my_var
my_func
my_private_func


4.2 패키지

  • 모듈과 패키지들의 구조화된 collection으로 선행 연구자가 만들어서 배포한 것
  • Numpy, Pandas, Matplotlib, Seaborn 등
import numpy
import matplotlib.pyplot as plt

print(numpy.sum([1,2,3,4,5]))
plt.plot([10,20,30,40], [1,4,9,16], 'rs--', [10,20,30,40], [11,24,9,6], 'g^-')
plt.show()

👉 결과


5 데이터 불러오기와 저장하기


5.1 Pandas를 이용한 csv 데이터 불러오기

csv 데이터 불러와서 확인하기

import pandas as pd

df = pd.read_csv('bank.csv', sep = ',')
print(df.head(3)) # default=5
print(df.tail(2)) # default=5

👉 결과(모양 깨짐) age;"job";"marital";"education";"default";"balance";"housing";"loan";"contact";"day";"month";"duration";"campaign";"pdays";"previous";"poutcome";"y"
0 30;"unemployed";"married";"primary";"no";1787;...
1 33;"services";"married";"secondary";"no";4789;...
2 35;"management";"single";"tertiary";"no";1350;...
age;"job";"marital";"education";"default";"balance";"housing";"loan";"contact";"day";"month";"duration";"campaign";"pdays";"previous";"poutcome";"y"
4519 28;"blue-collar";"married";"secondary";"no";11...
4520 44;"entrepreneur";"single";"tertiary";"no";113...

csv 파일로 저장하기

df.to_csv('data/bank_new.csv', index=False)

5.2 raw string을 이용하여 출력하기

  • string 앞에 r을 표기
  • 모든 escape 문자를 그대로 출력하기
string = "Hello!!!\tPython world.\n My name is Youngeun"
rstring = r"Hello!!!\tPython world.\n My name is Youngeun"

print(string)
print(rstring)

👉 결과
Hello!!! Python world.
My name is Youngeun
Hello!!!\tPython world.\n My name is Youngeun


5.3 f-string을 이용하여 출력하기

  • formatted string literals
  • 파이썬 3.6부터 format, %(서식지정자)와 같은 문자열 포매팅 방법 대신에 f-string이 가능함

문자열 " 앞에 f를 붙이고, 문자열 내에 {}를 이용하여 값을 지정

names = ['홍익', '파이썬', '스트링']
num_ints = [10, 20, 30]
num_float = 4321.12345678

# 변수 지정
print(f'{names}의 나이는 {num_ints}이다.')
# 변수를 인덱싱, 슬라이싱하여 지정
print(f'{names[0]}의 나이는 {num_ints[:2]}이다.')
# {}내 연산 가능
print(f'{names[0]}의 나이는 {num_ints[0] + num_ints[1]}이다.')
# 변수로 사용
for name, age in zip(names, num_ints):
    print(f'{name}의 나이는 {age}이다.')

👉 결과
['홍익', '파이썬', '스트링']의 나이는 [10, 20, 30]이다.
홍익의 나이는 [10, 20]이다.
홍익의 나이는 30이다.
홍익의 나이는 10이다.
파이썬의 나이는 20이다.
스트링의 나이는 30이다.

5.3-1 글자수, 정렬, 소숫점 자리수

글자수를 지정하여 문자열을 정렬

  • f-string의 중괄호{} 안에서 : 구분자를 이용함
  • 구분자 왼쪽은 문자나 숫자를, 오른쪽에는 정렬 기호와 숫자, 서식 지정자를 사용함
    - 정렬기호 : 없음 -> 왼쪽, ^ -> 가운데, > -> 오른쪽
    - 서식지정자 : 문자열 -> s, 정수 -> d, 실수 -> f

소수점 자릿수 지정

  • : 구분자 오른편에. 자릿수 f를 사용함
# 자리수와 정렬 지정
print(f'{names[0]:10s}의 나이는 {num_ints[0]:>10d}이다.')
print(f'{names[1]:>10s}의 나이는 {num_ints[0]:^10d}이다.')

# 소숫점 자리수 지정
print(f'{names[2]:>10s}의 숫자는 {num_float:^10.2f}이다.')

👉 결과
홍익 의 나이는 10이다.
파이썬의 나이는 10 이다.
스트링의 숫자는 4321.12 이다.

profile
나의 기록장

0개의 댓글

관련 채용 정보