[DATA-005][기초] pandas로 표 데이터를 골라 계산하고 묶기 > IT 기술 공유

본문 바로가기
사이트 내 전체검색

IT 기술 공유

[DATA-005][기초] pandas로 표 데이터를 골라 계산하고 묶기

페이지 정보

profile_image
작성자 기술팀장
댓글 0건 조회 248회 작성일 26-09-01 10:35

본문

[이번 수업]

Python의 pandas로 표를 만들고, 행·열 선택, 계산 열 추가, 그룹별 합계를 차례로 실습합니다.

[선수지식]

DATA-001~004의 데이터 형태, 품질 점검, SQL 집계와 Python 리스트·딕셔너리를 알면 좋습니다.

[학습목표]

1. Series와 DataFrame의 차이를 설명한다.
2. 조건식과 loc로 필요한 행·열을 선택한다.
3. 계산 열을 추가하고 groupby로 범주별 합계를 만든다.

[핵심개념]

pandas는 Python에서 표 형태 데이터를 다루는 도구입니다. Series는 인덱스라는 이름표가 붙은 1차원 배열이고, DataFrame은 여러 Series가 열로 모인 2차원 표입니다. DataFrame에는 행을 구분하는 index, 열 이름인 columns, 각 열의 자료형인 dtype이 있습니다.

분석 전 `head()`로 일부 행, `shape`로 크기, `dtypes`와 `info()`로 자료형과 결측 여부를 확인합니다. 숫자처럼 보이는 문자열은 계산을 망칠 수 있으므로 단위와 중복 기준도 함께 점검합니다.

열은 `df["price"]`, 여러 열은 `df[["category", "price"]]`로 고릅니다. `loc[행 조건, 열 목록]`은 이름과 조건을, `iloc`은 0부터 시작하는 위치를 사용합니다. 조건식이 만든 True 행만 loc에 남습니다.

열 연산은 열 전체에 같은 계산을 적용하는 벡터화 방식입니다. `quantity * price` 결과를 새 열에 넣을 수 있습니다. Series끼리 계산하면 위치가 아닌 인덱스를 맞추므로 인덱스가 다르면 결측값이 생길 수 있습니다.

`groupby`는 기준값으로 나누고(split), 그룹별 함수를 적용하고(apply), 결과를 합치는(combine) 과정입니다. `as_index=False`면 그룹 키가 일반 열로 남습니다. `sort_values`로 결과 순서도 정할 수 있습니다.

[따라하기]

pandas가 없다면 macOS·Linux는 `python3 -m pip install pandas`, Windows는 `py -m pip install pandas`를 실행합니다. 아래 내용을 pandas_demo.py로 저장합니다.

```python
import pandas as pd

sales = pd.DataFrame({
    "category": ["book", "book", "tool", "tool"],
    "quantity": [2, 1, 3, 1],
    "price": [15000, 22000, 8000, 5000],
})

sales["total"] = sales["quantity"] * sales["price"]
selected = sales.loc[
    sales["total"] >= 10000,
    ["category", "total"],
]
summary = (
    selected.groupby("category", as_index=False)["total"]
    .sum()
    .sort_values("total", ascending=False)
)

print(summary.to_string(index=False))
```

macOS·Linux는 `python3 pandas_demo.py`, Windows는 `py pandas_demo.py`를 실행합니다. 예상 결과는 다음과 같습니다.

```text
category  total
    book  52000
    tool  24000
```

total이 10,000 이상인 행을 category별로 합쳤으며 book 합계는 52,000입니다.

[흔한 실수]

- `df[df["total"] > 0]["category"] = ...`처럼 연속 선택 뒤 값을 바꿉니다. 의도가 분명한 `df.loc[조건, "category"] = ...`를 사용하세요.
- 열 이름의 대소문자·공백이나 숫자 열의 문자열 자료형을 확인하지 않습니다.
- `groupby` 결과가 원본 행과 같은 개수일 것으로 생각합니다. 집계하면 그룹당 한 행으로 줄어듭니다.
- 원본을 계속 덮어쓰면 변경 단계를 추적하기 어렵습니다.

[보안 주의]

개인정보와 기밀 열은 필요한 만큼만 읽고 로그에 출력하지 마세요. 출처 불명 pickle은 역직렬화 중 코드가 실행될 수 있으므로 열지 않습니다. 큰 파일은 크기를 확인한 뒤 필요한 열이나 청크만 읽고, 원본은 읽기 전용으로 보존하세요.

[직접 해볼 과제]

1. category가 food인 행 두 개를 추가하고 가격×수량 합계가 올바른지 확인하세요.
2. 필터 기준을 20,000으로 바꾼 결과와 10,000 기준 결과가 왜 다른지 행 단위로 설명하세요.

[확인문제]

1. Series와 DataFrame은 차원이 어떻게 다른가요?
2. loc와 iloc은 행·열을 선택하는 기준이 어떻게 다른가요?
3. groupby의 split-apply-combine은 각각 무엇을 뜻하나요?

[다음 학습]

DATA-006에서는 평균·분산·상관을 계산하고 숫자가 의미하는 바를 과장 없이 해석하는 방법을 배웁니다.

[공식 참고 자료]

- pandas 설치 안내: https://pandas.pydata.org/docs/getting_started/install.html
- 10 minutes to pandas: https://pandas.pydata.org/docs/user_guide/10min.html
- pandas 입문 튜토리얼: https://pandas.pydata.org/docs/getting_started/intro_tutorials/
- pandas GroupBy 공식 가이드: https://pandas.pydata.org/docs/user_guide/groupby.html
- pandas DataFrame API: https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html

댓글목록

등록된 댓글이 없습니다.

회원로그인

회원가입

사이트 정보

회사명 : 회사명 / 대표 : 대표자명
주소 : OO도 OO시 OO구 OO동 123-45
사업자 등록번호 : 123-45-67890
전화 : 02-123-4567 팩스 : 02-123-4568
통신판매업신고번호 : 제 OO구 - 123호
개인정보관리책임자 : 정보책임자명

접속자집계

오늘
4,230
어제
6,862
최대
16,772
전체
770,181
Copyright © 소유하신 도메인. All rights reserved.