데이터를 분석하는데 자주 쓰이는 파이썬 함수들을 학습하려고 한다.
<문자열 함수>
1. .startswith() : ~()로 시작하는 단어일 경우 True, 아니면 False 반환
word="superman"
print(word.startswith('s')) #True
print(word.startswith('super')) #단어도 가능
2. .split(): 문자열을 쪼개어 문자의 형태로 리스트에 저장하는 함수
intro="제 이름은 김토리입니다."
print(intro.split()) #문자열을 공백마다 잘라 단어를 리스트에 저장
fruits="사과, 귤, 배, 바나나"
print(fruits.split(",")) #문자열을 ,마다 잘라 단어를 리스트에 저장
numbers=" 1 2 3 "
print(numbers.split()) #['1','2','3']
print(numbers.split(' ')) #['','1','2','3','']
.split()함수에서 ()안에는 빈칸 말고도 ' ','\t' 이나 '\n'와 같이 여러 가지의 공백 문자가 올 수 있다.
맨 아래의 예시를 보면 numbers문자열을 두 가지 방법으로 쪼개었는데, split()과 split(' ')가 같지 않다는 것을 알 수 있다.
일단 공백1공백2공백3공백으로 이루어진 문자열을 .split()과 .split(' ')으로 쪼개었는데,
.split()에서는 ' ' 원소가 아예 없고, .split(' ')에서는 맨 앞에 ' '원소가 나온다.
.split()에서는 공백으로 문자열을 나누는거니 공백을 제외한 원소가 리스트의 원소로 들어간 것 같고,
.split(' ')에서는 공백으로 문자열을 나누되 공백을 포힘한 원소가 리스트의 원소로 들어간 것 같다.
또 다른 .split()과 .split(' ')의 차이점은?
.split()은 공백이 연속해서 몇 개가 있다고 해도 상관없이 무조건 공백 1개로 치고 처리하고,
.split(' ')은 공백을 각각 하나 하나 따로 처리한다.
string="a b c d "
print(string.split(' ')) #['a','b','','c','','','d','','','','d','','','','']
위의 예시를 보면, a 공백 b 공백공백 c 공백공백공백 d 공백공백공백공백으로 이루어진 문자열을 .split(' ')한 결과가
['a','b','','c','','','d','','','','d','','','','']라는 것을 알 수 있다.
즉, .split(' ')은 공백을 각각 하나 하나 따로 처리한다.
3. .upper() / .lower():대문자 변환/ 소문자 변환 but, 원래 문자열을 직접 수정하지는 않는다.
intro=" My name is Tori!"
print(intro.upper()) #MY NAME IS TORI!
print(intro.lower()) #my name is tori!
print(intro) #My name is Tori!
4. .replace('a', 'b'): 문자열에서 'a'를 'b'로 대체(수정) but, 3번과 마찬가지로 원래 문자열을 직접 수정하지는 않는다.
intro=" My name is Tori!"
print(intro.replace('Tori','토리')) # My name is 토리!
.replace() 함수를 이용하여 문자열의 공백을 제거
intro=" My name is Tori!"
print(intro.replace(' ','')) #MynameisTori!
print(intro) # My name is Tori!
<파일을 다루는 함수>
1. 파일 열기/ 닫기
file=open('data.txt') #파일을 열기
content=file.read() #파일을 읽어 내용을 변수에 저장
file.close() #파일을 닫음
2. 파일 자동으로 닫기
1번의 경우 파일을 열은 다음 마지막 줄에 파일을 닫아주는 코드를 작성해야한다.
하지만, 2번에서 쓰는 함수의 경우 파일을 열면 자동으로 닫아주기 때문에 file.close()를 작성해 줄 필요가 없다.
with open('data.txt') as file: #파일을 열기
content=file.read() #파일을 읽어 변수에 저장
#file.close() 필요없음
3. 줄 단위로 읽기
contents=[] #파일의 내용을 담을 빈 리스트를 생성
with open('data.txt') as file: #파일 열기
for line in file: #파일을 줄 단위로 읽기
contents.append(line) #파일의 내용을 첫 번째 줄에서 생성한 빈 리스트에 추가함
4. 파일의 모드
파일의 모드에는 읽기전용 파일, 쓰기전용 파일, 읽기와 쓰기가 모두 가능한 파일이 있다.
with open('data.txt','w') as file: #쓰기(Write) 모드로 파일 열기
file.write('Hello') #파일에 'Hello'를 쓰기
with open('data.txt','r') as file: #읽기(Read) 모드로 파일 열기
with open('data.txt', 'w') as file: # 쓰기(Write) 모드로 파일 열기
with open('data.txt','w+') as file: #읽기 및 쓰기 모드로 파일 열기
<데이터 정렬>
.sorted(): 데이터를 정렬하는 함수, 정렬하여 리스트로 반환함
numbers=[-1, 100, 5, -4, 3, 6, 100]
sort_by_abs= sorted(numbers, key=abs) #key=abs는 절대값을 기준으로 정렬한다는 것
print(sort_by_abs) #[-1,3,-4,5,6,100,100]
데이터의 정렬은 데이터가 숫자가 아닌 문자열이라도 가능하다.
데이터 정렬 함수를 사용함으로써 문자열을 사전순으로 정렬해준다.
fruits=['cherry', 'apple','banana']
sort_by_alphabet=sorted(fruits) #리스트에 있는 단어들을 사전순으로 정렬
print(sort_by_alphabet) #['apple', 'banana', 'cherry']
print(fruits) #['cherry', 'apple','banana'] => 원래의 리스트는 변하지 않음
##########질문#############
def reverse(word): #함수 정의
return str(reversed(word)) #단어를 거꾸로하여 반환
fruits=['cherry', 'apple','banana']
sort_by_last=sorted(fruits, key=reverse) #리스트에 함수를 적용시킨 후, 사전순 정렬
print(sort_by_last) #['cherry', 'apple', 'banana']
위의 예시를 파이참에서 돌려보면 #['cherry', 'apple', 'banana'] 가 출력된다.
근데 리스트에 함수를 적용시킨 결과는 ['yrrehc', 'elppa', 'ananab']이고, 이를 사전순으로 정렬한다면, ['banana','apple', 'cherry']가 나와야한다. 근데 왜 다른 결과..? 쩝
<데이터 순회>
for문과 items() 메서드를 이용하면 딕셔너리의 모든 키와 값을 (키, 값)의 형태로 리스트에 담을 수 있다.
users = {'gunwoo':'gw', 'harry':'hyhl'}
for user, id in users.items():
print(user, id)
#gunwoo gw
#harry hyhl
딕셔너리 형태인 데이터의 통계를 내기 위해서는 키와 값을 모두 불러와야 하는데, 그 때 주로 이용된다.
예제)
사용자가 시청한 작품의 리스트의 형식으로 저장된 딕셔너리를 작품의 수로 변환하는 함수 작성
user_to_titles = {
1: [271, 318, 491],
2: [318, 19, 2980, 475],
3: [475],
4: [271, 318, 491, 2980, 19, 318, 475],
5: [882, 91, 2980, 557, 35],
}
def get_user_to_num_titles(user_to_titles):
user_to_num_titles = {}
for user, titles in user_to_titles.items():
user_to_num_titles[user] = len(titles)
return user_to_num_titles #{1: 3, 2: 4, 3: 1, 4: 7, 5: 5}
<JSON>
JavaScript Object Notation
-웹 환경에서 데이터를 주고 받는 가장 표준적인 방식
-키를 이용하여 원하는 데이터만 빠르게 추출 가능
-데이터가 쉽게 오염되지 않음
-다른 포맷에 비해 용량이 조금 큰 편
import json
# JSON 파일을 읽고 문자열을 딕셔너리로 변환
def create_dict(filename):
with open(filename) as file:
json_string = file.read()
return json.loads(json_string)
# JSON 파일을 읽고 딕셔너리를 JSON 형태의 문자열로 변환
def create_json(dictionary, filename):
with open(filename, 'w') as file:
json_string = json.dumps(dictionary)
file.write(json_stri
<집합>
-중복 x, 순서x
#셋 모두 같은 값 {1,2,3}
set1={1,2,3}
set2=set([1,2,3])
set3={3,2,3,1}
-원소의 추가/삭제
추가=> .add() 와 .update() 이용
삭제=> .remove() 와 .discard() 이용
num_set={1,3,5,7}
num_set.add(9) #{1,3,5,7,9}
num_set.update([3,15,4]) #{1,3,4,5,7,9,15}
num_set.remove(7) #{1,3,4,5,9,15}
num_set.discard(13) #에러 발생 x=> 집합에 없는 원소를 지울 경우에도 에러 발생x
num_set.remove(13) #에러 발생 => 집합에 없는 원소를 지울 경우 에러 발생
-집합 다루기
num_set={1,3,5,7}
print(6 in num_set) #False
print(len(num_set)) #집합의 원소의 갯수 4
-집합 연산
set1={1,3,5,7}
set2={1,3,9,27}
union=set1|set2 #합집합
intersection=set1 & set2 #교집합
diff=set1-set2 #차집합
xor=set1^ set2 #{5,7,9,27}
<CSV>
Comma Separated Value
-각 열이 특정한 의미를 가짐
-데이터들이 컴마로 구분되어 있음/ ,말고 다른 구분 문자도 사용가능 ex) |
-,로 데이터들을 구분하는데 데이터에 ,가 포함된 경우에는? ==> 큰따옴표(" ")로 데이터를 감싸기
-데이터를 저장하는 데 용량을 적게 소모함(장점)
-데이터 오염에 취약함(단점)
<고급 파이썬 함수>
1. lambda
def square(x):
return x*x
square= lambda x: x*x
def get_eng_title(row):
split=row.split(',')
return split[1]
get_eng_title=lambda row: row.split(',')[1]
-함수를 한 줄로 간단하게 구현 가능
2. assert() :가정 설정문
-assert(조건, 오류메세지) 이 때, 오류메세지는 생략이 가능
-어떤 조건이 True임을 보장하기 위해서 사용하는 것
def square1(x):
return x*x
square2= lambda x: x*x
assert(square1(3)==square2(3)) #두 값이 같으면 통과, 아니면 에러
3. map(적용시킬 함수, 반복 가능한 자료형)
-리스트가 아닌 map이라는 타입을 가짐 =>출력 시, 리스트로 형변환 해줘야 함
def plus_1(n):
return n+1
l=[1,2,3,4,5]
#map()은 적용할 함수, 함수를 적용시킬 값들 이렇게 2개의 인자를 갖음
result=list(map(plus_1, l)) #[2, 3, 4, 5, 6]
4. filter(적용시킬 함수, 반복 가능한 자료형)
-리스트가 아닌 filter 타입을 가짐 =>출력 시, 리스트로 형변환 해줘야 함
-3번의 map()과 동일한 구조로 동작함
-map은 특정 대상전체에 원하는 함수를 적용시키는 것이지만, filter은 함수에 넣어 반환이 true인 값을 필터링하여 원하는 값들만 쏙 빼는 것
def even(x):
if x%2==0:
return True
else:
return False
arr=list(filter(even,range(1,11)))
print(arr) #[2,4,6,8,10]