파이썬을 이용하여 파일을 다룰 때는 open 키워드를 이용한다.
f = open("<filename>", "mode")
'''
mode = {'r': 읽기, 'w':쓰기, 'a':추가}
'''
f.close()
# test.txt
'''
abc
def
efg
'''
# contents = f.read() # txt파일에 있는 내용을 문자열로 반환
# contents_list = f.readlines() # 파일 전체를 list로 반환한다. 한 줄씩 일어 list로 반환한다.
f = open('test.txt', 'r')
contents = f.read()
print(contents)
print(type(contents))
f.close()
f = open('test.txt', 'r')
contents_list = f.readlines()
print(contents_list)
print(type(contents_list))
f.close()
# 출력 결과
'''
abc
def
efg
<class 'str'>
['abc\n', 'def\n', 'efg']
<class 'list'>
'''
read()를 이용했을 때 type은 str임을 알 수 있고, readlines()를 이용했을 경우에 type이 list임을 알 수 있다. readlines()로 읽어왔을 때 \n이 문자열에 포함되어있다는 것을 잊지 말자
f = open('test.txt', 'r')
line_to_list = []
while True:
contents_line = f.readline()
print(contents_line)
print(type(contents_line))
if not contents_line : break
else:
line_to_list.append(contents_line)
print(line_to_list)
f.close()
'''
abc
<class 'str'>
def
<class 'str'>
efg
<class 'str'>
<class 'str'>
['abc\n', 'def\n', 'efg']
'''
readline()은 한줄 씩 읽어 while문을 통해 끝까지 읽어줘야 한다. 한줄씩 str형태로 읽어오는 것을 알 수 있고 \n이 있다는 것도 잊지 말자.
이러한 고려사항을 설정해주는 방법으로는 두가지가 있다.
configparser는 cfg 파일에 정보를 넣어 설정하고, argparser은 실행 시점에 정보를 설정해준다.
configparser은 앞서 말한 것 처럼 cfg파일에 설정 파일로 실행 정보를 저장한다. section, key, value의 형태로 설정파일을 사용하며 dict type으로 호출하여 사용이 가능하다.
예제
# config_ex.cfg
[section1]
이름:철수
나이:26
[section2]
취미:운동
# configparser_ex.py
from configparser import SafeConfigParser
config = SafeConfigParser()
config.read('<file path>/config_ex.cfg')
print(config.sections())
for key in config['section1']:
value = config['section1'][key]
print(key, value)
# 출력 결과
'''
['section1', 'section2']
이름 철수
나이 26
'''
console(까만창)을 이용하여 프로그램을 실행할 때 정보를 입력한다.
예제
# 실행방법
# python argparser.py -a 10 -b 10 혹은 argparser.py --a_value 10 --b_value 20
import argparse
parser = argparse.ArgumentParser(description='Sum two integers')
parser.add_argument('-a', '--a_value', dest='a', help='A integers', type=int, required=True)
parser.add_argument('-b', '--b_value', dest='b', help='B integers', type=int, required=True)
args = parser.parse_args()
print(args)
print(args.a)
print(args.b)
print(args.a + args.b)
'''
Namespace(a=10, b=20)
10
20
30
'''
Operation function을 실행 할 때 기준이 되는 dimension축이다.
test = np.arange(1, 7).reshape(2, 3)
test
'''
array([[1, 2, 3],
[4, 5, 6]])
'''
test의 shape는 (2, 3)이다. 여기서 axis 0 은 2이고 axis 1은 3이 된다.
그러면 axis를 이용한 sum 계산을 해보자
test.sum(axis=0)
'''
array([5, 7, 9])
'''
test.sum(axis=1)
'''
array([ 6, 15])
'''
axis 0을 기준으로 계산(Sum)을 했을 경우 세로로 더해지고 axis 1을 기준으로 계산했을 때 가로로 계산되는 것을 확인할 수 있다.
본인은 axis를 헷갈려해서 다른 방법으로 이해한다.
만약 axis가 0일 경우 원래 array의 shape의 0번째 요소를 가린다. 여기서는 (2, 3)이었기 때문에 0번째 요소를 가리면 3만 남는다. 이게 output의 shape이라고 생각한다. 마찬가지고 axis가 1일 경우 shape의 1번째 요소 즉 3을 가리면 2만 남는다. output의 shape은 (2,)로 나오는 것을 확인할 수 있다.
array를 합치는 함수로 사용된다.(list의 append와 비슷하지만 다른느낌..?)
여기서도 axis를 사용하는데 맨날 까먹어서
예시로 확인해보자
예시(vstack, hstack)
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print(np.vstack((a, b)))
print(np.hstack((a, b)))
'''
array([[1, 2, 3],
[4, 5, 6]]) #vstack
array([1, 2, 3, 4, 5, 6]) #hstack
'''
vstack의 경우는 수직(Vertical)하게 합쳐주고 hstack의 경우 수평(horizontal)하게 합쳐준다.
element-wise operations는 굳이 설명이 필요없이 같은 행, 같은 열에 있는 것 끼리 연산을 하고 같은 shape의 결과값이 나온다.
vector-scalar, vector-matrix연산도 지원되는 연산임,
Bool 타입을 가진 값들로도 인덱싱이 가능하다.
a = np.arange(12).reshape(3,4)
b = a > 4
print(b)
# [[False False False False]
# [False True True True]
# [ True True True True]]
print(a[b])
# [ 5 6 7 8 9 10 11]
a[b] = 0
print(a)
# [[0 1 2 3]
# [4 0 0 0]
# [0 0 0 0]]
판다스는 굳이 외울필요 없고 필요할때마다 구글링을 통해 가져다 쓸 줄 아는 것이 중요하다고 하셨음.. 일단 어떤 기능이 있는지 알고 얼른 가져다 쓰는 능력이 중요함..
데이터프레임은 아래와 같이 만들 수 있다.(하지만 보통 csv파일 읽어서 하므로 이렇게 쓰일 일이 거의 없다..)
import pandas as pd
df1 = pd.DataFrame({'a':['a0','a1','a2','a3'],
'b':['b0','b1','b2','b3'],
'c':['c0','c1','c2','c3']},
index = [0,1,2,3])
df2 = pd.DataFrame({'a':['a2','a3','a4','a5'],
'b':['b2','b3','b4','b5'],
'c':['c2','c3','c4','c5'],
'd':['d2','d3','d4','d5']},
index = [2,3,4,5])
print(df1,'\n\n', df2)
# append함수를 이용하여 행을 추가할 수 있음
df1.append(df2)
pd.concat([df1, df2]) # axis=0 디폴트, axis가 0일 경우 두 데이터 프레임의 행을 공유한다.
# index를 초기화 하기 위해서 ignore_index를 할 수 있다.
result = pd.concat([df1, df2], ignore_index=True)
result
# null 처리
result.fillna(0)
# axis가 1일 경우에 행 추가됨, index를 공유
pd.concat([df1, df2], axis=1)
# inner 조인을 하게 되면 null값을 제외한 데이터를 반환하게 된다.
pd.concat([df1, df2], axis=1, join='inner')
df1 = pd.DataFrame({
'data1':range(6),
'key':list('aabbcc')
})
df2 = pd.DataFrame({
'data2':range(3),
'key':list('cad')
})
print(df1, '\n\n', df2)
# default 는 inner임
# 공통 열이름을 기준으로 inner join을 함
pd.merge(df1, df2)
pd.merge(df1, df2, on='key', how='outer')
pd.merge(df1, df2, on='key', how='left')
# left join을 수행하면 df1를 기준으로 join을 수행하여 df2에 해당 key 값이 없는 경우NaN 값을 반환
df1 = pd.DataFrame({
'data1' : range(7),
'lkey' : list('abcabca'),
}, index = range(7))
df2 = pd.DataFrame({
'data2' : range(3),
'rkey' : list('abd')
}, index = [2, 3, 4])
# join 함수는 디폴트값으로 left join을 수행하기 때문에 같은 merge와 같은 결과를 확인할 수 있음
# 병합 기준 역시 행 인덱스를 기반으로 병합이 수행됨
df1.join(df2)
import pandas as pd
import numpy as np
from sklearn.datasets import load_boston
X, y = load_boston(return_X_y=True)
flist=['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV']
# Boston_X는 데이터프레임의 형태가 되고, y는 array 형태가 된다
Boston_X = pd.DataFrame(X, columns = flist[:-1])
# y를 데이터프레임으로 바꾸고 axis=1로 열을 추가해준다.
all_Boston = pd.concat([Boston_X, pd.DataFrame(y, columns=['MEDV'])], axis=1)
all_Boston
같은 데이터이지만 추가되는 데이터가 있어서 합쳐야 하는데 그냥 조인으로 하면 안됐음
→ concat, duplicate 제거로 해결