###워크시트###.UsedRange(): 내용이 있는 셀만 범위로 지정. 시트의 무한한 셀을 지정하지 않기 위해.
###워크시트###.Range("A1: C3")/ Range("A1","B2") : 특정 셀 혹은 일정 범위를 지정할 수 있다.
ws.UsedRange()
[엑셀 데이터 pandas DataFrame으로 옮기기]
pd.DataFrame(ws.UsedRange()) : 엑셀 워크북에서 특정 범위만 추출해서 dataframe으로 저장한다. 여기서는 내용이 적힌 셀들만 가져온다.
df.iloc[:, 7:38] : 가져온 데이터프레임에서 특정 열만 가져온다 (엑셀의 "H:AL").
아직 컬럼이름이 정해지기 전이기 때문에 iloc를 이용해서 열 인덱스로 지정한다.
df.rename(columns=): 컬럼 명을 정해줄 수 있다. =뒤에 '@#$%' 직접 이름을 적어줄 수도 있고, 리스트 이름을 지정해줄 수도 있다.
. loc[]/.iloc[] 로 행을 지정해주면 데이터 프레임의 특정 행을 컬럼으로 설정할 수 있다. 0,1,2,3 .. 으로 자동으로 정해져있던 컬럼 인덱스가 정해준 컬럼이름으로 바뀐다.
df.drop(df.index[0:7]) : 0~6 까지의 행을 삭제한다. ('df='를 안붙여줘도 inplace=True 를 해주면 df에 덮어쓴다.) 컬럼 명이 있다면, columns=[#컬럼이름#, ... ] 해줘도 된다.
df.reset_index() : 행, 열을 삭제함으로써 최초 DataFrame에서 가져올 때의 인덱스가 틀어졌는데, 다시 0 부터 인덱스를 만든다. 이 때 기존에 틀어진 인덱스를 맨 왼쪽 컬럼에 데이터로 저장하는데, 기존 인덱스를 버리려면 drop=True 를 해준다.
candb = pd.DataFrame(ws.UsedRange()) # 데이터 적힌 셀들만 추출해서 dataframe에 저장.
candb = candb.iloc[:, 7:38] # 원하는 컬럼만 추출하기
candb = candb.rename(columns=candb.loc[6]) # 컬럼 이름 정하기
candb.drop(candb.index[0:7], inplace=True) # 필요없는 행 삭제하기
candb.drop(columns=['Address', 'Src MAC', 'Src IP', 'NmNode', 'Remote Network \nWake Up Request', 'HS CAN Routing Factor',
'UsrMsgPurpose', 'GenMsgStartDelayTime', 'Msg Receiver', 'TPIndex', 'UserSigValidity'], inplace=True)
candb = candb.reset_index(drop=True) # 인덱스를 다시 0부터 정렬하기
[중복되는 컬럼 이름 바꾸기]
데이터 프레임에서 컬럼으로 지정한 열에 동일한 데이터가 중복되어 있을 때,
컬럼이름이 중복되면 지정에 불편함이 생긴다.
중복된 이름을 다른 이름으로 변경해주기 위해, 딕셔너리를 사용한다.
key : '중복된 이름' : [대체할 이름, , ... ]
d = {'Name': ['Name', 'Name.1', 'Name.2']}
candb = candb.rename(columns=lambda c: d[c].pop(0) if c in d.keys() else c) # 동일한 이름의 컬럼을 딕셔너리껄로 대체
[엑셀 닫기]
wb.Close(): 열었던 워크북, 엑셀 파일을 닫는다.
SaveChanges=True/False:위에서 사용한 .Visible() 이 True건 False건 엑셀을 닫을 때 저장 여부 물어보는 팝업이 뜬다. 해당 팝업이 안뜨게 알아서 저장/저장하지 않음을 지정해 줄 수 있다.
excel.Quit(): 윈도우 백그라운드에 실행했던 엑셀 어플리케이션을 종료한다.
wb.Close(SaveChanges=False) # 저장여부- NO
excel.Quit()
[풀 코드]
import pandas as pd
import PySimpleGUI as sg
import win32com.client
excel = win32com.client.Dispatch("Excel.Application") #자물쇠 엑셀을 열기위한 win32
wb = excel.Workbooks.Open('주소 & 파일명.xls') # 입력받은 엑셀을 wb에 저장
excel.Visible = True # False로 바꿔주기 / 엑셀 안띄우게하기
ws = wb.Sheets("MAIN bus") # 사용할 시트
candb = pd.DataFrame(ws.UsedRange()) # 빈 영역 제외하고 데이터 적힌 셀들만 추출해서 dataframe에 저장.
candb = candb.rename(columns=candb.loc[0]) # 컬럼 이름을 첫 행으로 정하기
candb.drop(candb.index[0:431], inplace=True) # 필요없는 행 삭제하기
candb = candb.reset_index(drop=True) # 인덱스를 다시 0부터 정렬하기
#d = {'Name': ['Name', 'Name.1', 'Name.2']}
#candb = candb.rename(columns=lambda c: d[c].pop(0) if c in d.keys() else c) # 동일한 이름의 컬럼을 딕셔너리껄로 대체
wb.Close(SaveChanges=False) # 저장여부- NO
excel.Quit() # 엑셀 종료
print(candb)
아나콘다와 파이참 둘다 깔아서인지, xlwings 인스톨 후 아래와 같은 오류가 나면서 addin이 안깔렸는데,
xlwings : 'xlwings' 용어가 cmdlet, 함수, 스크립트 파일 또는 실행할 수 있는 프로그램 이름으로 인식되지 않습니다. 이름이 정확한지 확인하고 경로가 포함된 경우 경로가 올바른지 검증한 다음 다시 시도하십시오. 위치 줄:1 문자:1 + xlwings addin install + ~~~~~~~ + CategoryInfo : ObjectNotFound: (xlwings:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException
아나콘다 기본 모듈이라고 하는데 내가 xlwings를 또 깔았으니 혹시 중복되었나 싶어서..
윈도우 검색창에서 xlwings 를 검색, 파일 위치 열기
-> C:\Users\M\PycharmProjects\pythonProject\rusted-host 폴더 안의 xlwings, xlwings-0.25.3.dist-info 폴더를 다른데로 옮겨 버렸다. -> 지워버려도 되는 지는 확신이 안서서 일단 냅뒀다
운영체제나 C, C++, Pascal 등과 같은 언어로 응용 프로그램을 만들 때, 윈도우를 만들고 파일을 여는 것과 같은 처리를 할 수 있도록 1,000여 개 이상의 함수로 구성되어 있다. API는 프로그래머를 위한 운영체제나 프로그램의 인터페이스로서 사용자와 직접 대하게 되는 그래픽 사용자 인터페이스나 명령형 인터페이스와 뚜렷한 차이가 있다.
2) usecols, userows : 엑셀에서 어느 행 혹은 어느 열을 불러올지 선택 가능.
3) names= 행의 이름
col_names= ['스트레스','스트레스남학생','스트레스여학생','우울감','우울남학생','우울여학생','자살생각률','자살남학생','자살여학생'] #컬럼 이름 정의
raw_data= pd.read_excel('C:\\Users\\ASUS\\Downloads\\Report.xls', header=1, usecols="C:K", names=col_names)
2. dataframe 데이터 정렬
새로운 행 추가 : df.loc[1]= 100- df.loc[0] (기존의 행을 참조하여 연산 결과로 df.loc[1]을 새로 추가)
새로운 열 추가 : df['@@']= ['##', '###'] (하나의 값을 넣으면 해당 열 모든 값이 하나의 값으로 중복되어 입력)
raw_data.loc[1]=100-raw_data.loc[0] # 데이터 프레임의 열을 나타낼 때, loc[i] 로 나타낼 수 있음.
raw_data['응답']=['그렇다','아니다'] # loc 없이 그냥 chr or str 형식이면 일반적으로 column을 나타냄
raw_data.set_index('응답',drop=True, inplace=True) # 인덱스를 위에서 정의한 컬럼인 '응답' 으로 지정. inplace = 기존의 인덱스 0,1,2,.. 를 이걸로 대체한다. drop = 기존 인덱스는 버린다.
* inplace=True :
raw_data=raw_data.set_index(~ 이렇게 하지 않으면, raw_data 값에 새로 인덱스 설정한 값이 저장되지 않는다.
inplace=True 는 앞에 'raw_data=' 를 붙이지 않아도 raw_data 값이 갱신되게 해준다.
특정 컬럼 지우기 : .drop(columns=' 컬럼 이름' , inplace=True)
raw_data['스트레스'].plot.pie(explode=[0,0.02]) # plot 모듈의 pie 차트 기능. explode : 다른 영역 간 간격
여러 플롯 그리는 경우
plt 모듈에서 subplots ( 행, 열, figsize=(가로, 세로))
f= figure, ax= axis 속성
그래프 제목 : ax[i]. set_title
그래프 라벨 : ax[i].ylabel
subplots 혹은 plot 으로 시작하여
plt.show() 로 끝남 둘 사이의 plot들을 모두 출력
f, ax = plt.subplots(1,3, figsize=(16,8)) # 1행 3열의 플롯을 그린다. f는 figure, ax는 axes 속성 지정
raw_data['스트레스'].plot.pie(explode = [0, 0.02], ax=ax[0], autopct='%1.1f%%') # 데이터, 그래프 내부
ax[0].set_title('스트레스를 받은 적 있다. ')# a[0]: 서브플롯 3개중 첫번째 플롯의 속성. label, axis 등 축 관련 속성
ax[0].set_ylabel('')
raw_data['우울감'].plot.pie(explode = [0, 0.02], ax=ax[1], autopct='%1.1f%%') # 데이터, 그래프 내부
ax[1].set_title('우울증을 경험한 적 있다. ')# a[0]: 서브플롯 3개중 첫번째 플롯의 속성. label, axis 등 축 관련 속성
ax[1].set_ylabel('')
raw_data['자살생각률'].plot.pie(explode = [0, 0.02], ax=ax[2], autopct='%1.1f%%') # 데이터, 그래프 내부
ax[2].set_title('자살을 고민한 적 있다. ')# a[0]: 서브플롯 3개중 첫번째 플롯의 속성. label, axis 등 축 관련 속성
ax[2].set_ylabel('')
plt.show()
[풀 코드]
import matplotlib.pyplot as plt
import pandas as pd
from matplotlib import font_manager, rc
f_path ="C:\Windows\Fonts\HYWULM.ttf" # matplotlib 에서 한글지원하도록 해주는 폰트
font_name=font_manager.FontProperties(fname=f_path).get_name()
rc('font', family=font_name)
# f. ~ 으로 나타내는 것은 print해보면 해당 값이 아닌 주소 값임을 알 수 있다.
col_names= ['스트레스','스트레스남학생','스트레스여학생','우울감','우울남학생','우울여학생','자살생각률','자살남학생','자살여학생'] #컬럼 이름 정의
raw_data= pd.read_excel('C:\\Users\\ASUS\\Downloads\\Report.xls', header=1, usecols="C:K", names=col_names ) #pandas의 read_excel을 사용해, 데이터를 데이터 프레임으로 가져옴
# 기존 엑셀의 C:K 까지의 컬럼을 가져옴. 컬럼 이름은 col_names
raw_data.loc[1]=100-raw_data.loc[0] # 데이터 프레임의 열을 나타낼 때, loc[i] 로 나타낼 수 있음.
raw_data['응답']=['그렇다','아니다'] # loc 없이 그냥 chr or str 형식이면 일반적으로 column을 나타냄
raw_data.set_index('응답',drop=True, inplace=True) # 인덱스를 위에서 정의한 컬럼인 '응답' 으로 지정. inplace = 기존의 인덱스 0,1,2,.. 를 이걸로 대체한다. drop = 기존 인덱스는 버린다.
raw_data['스트레스'].plot.pie(explode=[0,0.02]) # plot 모듈의 pie 차트 기능. explode : 다른 영역 간 간격
f, ax = plt.subplots(1,3, figsize=(16,8)) # 1행 3열의 플롯을 그린다. f는 figure, ax는 axes 속성 지정
raw_data['스트레스'].plot.pie(explode = [0, 0.02], ax=ax[0], autopct='%1.1f%%') # 데이터, 그래프 내부
ax[0].set_title('스트레스를 받은 적 있다. ')# a[0]: 서브플롯 3개중 첫번째 플롯의 속성. label, axis 등 축 관련 속성
ax[0].set_ylabel('')
raw_data['우울감'].plot.pie(explode = [0, 0.02], ax=ax[1], autopct='%1.1f%%') # 데이터, 그래프 내부
ax[1].set_title('우울증을 경험한 적 있다. ')# a[0]: 서브플롯 3개중 첫번째 플롯의 속성. label, axis 등 축 관련 속성
ax[1].set_ylabel('')
raw_data['자살생각률'].plot.pie(explode = [0, 0.02], ax=ax[2], autopct='%1.1f%%') # 데이터, 그래프 내부
ax[2].set_title('자살을 고민한 적 있다. ')# a[0]: 서브플롯 3개중 첫번째 플롯의 속성. label, axis 등 축 관련 속성
ax[2].set_ylabel('')
plt.show()