반응형
엑셀 대신 파이썬 자동화 가이드
1. 왜 파이썬인가: 반복·정확·확장
엑셀은 손이 빠르면 편하지만, 사람 손실수가 쌓일수록 오류가 늘고 재현이 어렵습니다. 파이썬은 한 번 짠 스크립트를 매일 재사용할 수 있고, 데이터가 커져도(수십만 행) 비교적 안정적으로 처리합니다. 또한 외부 시스템(쇼핑몰·결제·광고) API 연동, 이미지/텍스트 처리까지 확장이 쉬워 온라인 판매에 최적입니다.
2. 10분 셋업: 설치→첫 스크립트
- 파이썬 설치: 공식 사이트에서 3.x 버전 설치(Windows는 “Add to PATH” 체크).
- 가상환경: 프로젝트 폴더에서
python -m venv .venv
→ 활성화 후pip install pandas openpyxl
. - 폴더 구조:
project/ ├─ data/ # 원천 CSV/XLSX ├─ output/ # 산출물 ├─ logs/ # 로그 파일 └─ run.py # 메인 스크립트
첫 스크립트(복붙)
import pandas as pd
src = "data/orders.csv"
df = pd.read_csv(src)
df["order_date"] = pd.to_datetime(df["order_date"])
df = df[df["status"].eq("paid")] # 결제완료만
df.to_excel("output/orders_paid.xlsx", index=False)
3. 실전 레시피 7가지(엑셀 대체)
3-1. VLOOKUP → merge
orders = pd.read_csv("data/orders.csv")
items = pd.read_csv("data/items.csv")
df = orders.merge(items[["item_id","category","price"]], on="item_id", how="left")
3-2. 피벗테이블 → pivot_table
pivot = pd.pivot_table(df, values="price", index="category",
columns=df["order_date"].dt.date, aggfunc="sum", fill_value=0)
3-3. 중복 제거/고유값
unique_customers = df.drop_duplicates("customer_id").shape[0]
dups = df[df.duplicated(subset=["order_id","item_id"], keep=False)]
3-4. 조건부 계산(IF)
import numpy as np
df["is_weekend"] = df["order_date"].dt.dayofweek >= 5
df["ship_fee"] = np.where(df["price"]>=50000, 0, 3000)
3-5. 문자열 정리(TRIM/LOWER/REPLACE)
df["clean_name"] = (df["customer_name"].str.strip()
.str.replace(r"\s+"," ", regex=True)
.str.title())
3-6. 날짜 파싱·기간 필터
mask = (df["order_date"] >= "2025-08-01") & (df["order_date"] < "2025-09-01")
aug = df.loc[mask]
3-7. 그룹 요약(월간 매출·객단가)
monthly = (df.groupby(df["order_date"].dt.to_period("M"))
.agg(sales=("price","sum"),
orders=("order_id","nunique"),
customers=("customer_id","nunique")))
monthly["aov"] = monthly["sales"] / monthly["orders"]
4. 리포트 자동 생성(엑셀/CSV/이미지)
산출물은 엑셀·CSV·PNG 차트로 저장하면 공유가 쉽습니다. 엑셀로 저장할 때 시트 여러 개를 한 파일에 넣을 수 있습니다. 간단한 시각화도 자동으로 그려서 파일로 내보내면 매일 보고서가 완성됩니다.
4-1. 다중 시트 엑셀 저장
with pd.ExcelWriter("output/report.xlsx", engine="openpyxl") as xw:
df.to_excel(xw, sheet_name="raw", index=False)
pivot.to_excel(xw, sheet_name="pivot")
monthly.reset_index().to_excel(xw, sheet_name="monthly", index=False)
4-2. 간단 차트(PNG) 저장
import matplotlib.pyplot as plt
ax = monthly["sales"].plot(kind="bar", figsize=(8,3))
ax.set_title("Monthly Sales")
plt.tight_layout()
plt.savefig("output/monthly_sales.png")
4-3. 요약 텍스트 자동 작성
summary = {
"월수": len(monthly),
"총매출": int(monthly["sales"].sum()),
"최고월": str(monthly["sales"].idxmax())
}
open("output/summary.txt","w",encoding="utf-8").write(str(summary))
바로 적용
- 입력 파일명 규칙:
orders_YYYYMMDD.csv
로 통일. - 폴더 권한:
data/
는 읽기,output/
는 쓰기. - 실행 로그를 파일로 남겨 재현성 확보.
주의
- 주문·고객 데이터 등 개인정보는 암호화/마스킹 후 처리.
- 파일 열려있으면 저장 오류 → 실행 전 엑셀 파일 닫기.
- 수치가 비정상 급증 시 원본 파일부터 검증.
5. 스케줄링: 매일 9시 자동 실행
5-1. 스크립트 엔트리포인트
# run.py
import pandas as pd, logging, pathlib, datetime as dt
logging.basicConfig(filename="logs/run.log", level=logging.INFO, format="%(asctime)s %(message)s")
ROOT = pathlib.Path(__file__).resolve().parent
def main():
df = pd.read_csv(ROOT/"data/orders.csv")
df["order_date"] = pd.to_datetime(df["order_date"])
df = df[df["status"].eq("paid")]
df.to_excel(ROOT/"output/orders_paid.xlsx", index=False)
logging.info("done: %s rows", len(df))
if __name__ == "__main__":
main()
5-2. Windows 작업 스케줄러
프로그램/스크립트: C:\경로\project\.venv\Scripts\python.exe
인수 추가: C:\경로\project\run.py
시작 위치: C:\경로\project
5-3. macOS/Linux 크론
# 매일 09:00 실행
0 9 * * * /경로/project/.venv/bin/python /경로/project/run.py >> /경로/project/logs/cron.log 2>&1
검수 체크리스트(복붙)
- 원본 파일 수/열 이름이 사양과 일치하는가?
- 날짜/통화/문자 인코딩 오류가 없는가?
- 산출 파일이 덮어쓰기/버전관리 규칙을 따르는가?
- 로그에 오류 스택이 없는가?
- 개인정보는 익명화/최소 수집 원칙을 지켰는가?
자주 묻는 질문
엑셀을 아예 안 써도 되나요?
최종 공유·검토는 엑셀이 편할 수 있습니다. 다만 가공/집계를 파이썬으로 바꾸면 품질과 속도가 올라갑니다.
코딩이 처음인데 어렵지 않을까요?
pandas
의 10여 개 함수만 익히면 대부분의 반복작업을 커버합니다. 위 레시피를 복붙해 구조만 바꾸며 시작하세요.
회사 보안 때문에 설치가 제한적입니다.
휴대용(포터블) 파이썬이나 사내 승인된 환경에서 가상환경을 쓰세요. 데이터는 로컬/사내 스토리지에 두고 외부 업로드를 금지합니다.
반응형