python

[단순반복작업은 파이썬으로!] 엑셀자료 기반으로 평균값 구하기

Strong_H 2021. 11. 22. 22:16

# 문제발생

지난번 openpyxl로 단가를 긁어와서 입력했던거에 추가로 평균단가를 입력해야한다.

엑셀파일은 두개이며, 첫번째 엑셀파일에는 최근 약 1년치의 품목코드 별 단가가 작성되어있고,

두번째 엑셀파일에는 품목코드만 입력되어있다

 

6개월을 기준으로 중복되는 모든값을 구해서 평균값으로 두번째 엑셀파일에 입력해줘야 한다.

 

 

# 해결 아이디어

1. 평균구하기

def average(list):
 return (sum(list)) / len(list)

2. 첫번째 엑셀파일에는 품목코드가 굉장히 많이 중복되고있다, 기간별 단가만 상이하므로 품목코드:0의 형태로 딕셔너리로 만든다.

( 딕셔너리의 키값은 중복이 허용되지 않는 특성 이용 )

3. 빈 리스트를 만들어서 딕셔너리에 저장된 키값과 첫번째 엑셀의 품목코드가 일치할때 같은 행에있는 단가를 리스트에 append

4. 딕셔너리에 저장된 키값과 두번째 엑셀파일에 품목코드가 일치할때 같은 행에 평균단가를 입력

 

늘 그렇듯 거창한 계획부터 세우고 본다..

 

 

완성된 형태는 대략 다음과 같다

baseList = { 'aa001' : 0 , 'aa002' : 0 , ....}

lis = [3000,2900,3000,3100,....]  # aa001일때

lis = [1000,1200,1100,1200,....]  # aa002일때 # 코드에 따라 계속 바뀌고 초기화됨

 

import openpyxl
wb = openpyxl.load_workbook(filename='첫번째 엑세파일.xlsx')
wb2 = openpyxl.load_workbook(filename='두번째 엑셀파일.xlsx')
a_sheet = wb['시트1']
a2_sheet = wb['시트2']
b_sheet = wb2['시트1']

def average(list):
 return (sum(list)) / len(list)

baseList = {}
for i in range(2,1199):
 baseList[a_sheet['b' + str(i)].value] = 0
for j in range(0,len(baseList.keys())):
 code = list(baseList.keys())[j]
 lis = []
 for n in range(2,1199):
 if code == a_sheet['b'+str(n)].value:
 lis.append(a_sheet['e'+str(n)].value)
 for nu in range(2,4128):
 if code == b_sheet['a'+str(nu)].value:
 b_sheet['g'+str(nu)] = average(lis)

wb2.save('저장할 파일명.xlsx')
print('완료')

# range함수의 숫자는 긁어올, 입력할 열의 구간

 

 

# 후기

그리고 다 완성되고나니 드는 생각인데, 엑셀 자체에 이미 코드짜놓은거랑 흡사한 기능이 있을거같다...

파이썬으로 돌리는거만큼 빠른 속도를 보여줄지는 모르겠지만?

 

 

'python' 카테고리의 다른 글

[단순반복작업은 파이썬으로!] 엑셀 빅(?)데이터 간단 작업  (0) 2021.11.22
크롤링 완성(?)  (0) 2021.11.22
웹 스크랩핑(크롤링)_2  (0) 2021.11.18
웹 스크랩핑(크롤링)  (0) 2021.11.18
Python - 기초개념2  (0) 2021.11.18