데이터분석 기초

데이터분석 기초5

토리쟁이 2022. 6. 1. 05:07

데이터를 분석하는데 자주 쓰이는 파이썬 함수들을 학습하려고 한다.

 

<문자열 함수>

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]

'데이터분석 기초' 카테고리의 다른 글

데이터분석 기초4  (0) 2022.05.14
데이터분석 기초3  (0) 2022.05.01
데이터분석 기초2  (0) 2022.04.29
데이터분석 기초1  (0) 2022.04.29