pandas 100제: 판다스 연습문제와 풀이 · 13장
부록 pandas 치트시트: 100제 핵심 문법 한눈에 보기
pandas 100제에 나온 핵심 문법을 장별 표로 정리하고, loc·iloc, agg·transform, merge·concat처럼 헷갈리는 짝을 비교한 치트시트
9분 읽기
이 장의 목차 13개
pandas 100제에서 쓴 핵심 문법을 장별로 모은 요약표입니다. 각 표의 "문제" 칸 번호로 돌아가면 같은 문법을 쓴 실제 예제와 실행 결과, 풀이가 있습니다.
처음 데이터를 받으면 이 순서로
- 모양 보기 —
df.shape, df.head(), df.tail() - 열과 자료형 —
df.columns, df.dtypes (숫자여야 할 열이 문자열로 들어오지 않았는지) - 빈 값과 중복 —
df.isna().sum(), df.duplicated().sum() - 요약과 분포 —
df.describe(), df["범주"].value_counts() - 정리 — 공백·대소문자(
.str), 날짜 변환(pd.to_datetime), 결측치 처리 - 질문에 답하기 — 거르기·정렬·
groupby·merge - 그래프로 확인 —
plot()으로 숫자가 말하는 것을 눈으로 확인
헷갈리는 짝 한 번에 비교
| 짝 | 앞의 것 | 뒤의 것 | 문제 |
|---|
df["a"] vs df[["a"]] | Series(1차원) | DataFrame(열 하나짜리 표) | 021–022 |
loc vs iloc | 라벨로, 끝 포함 | 위치로, 끝 미포함 | 024–025 |
and·or vs &·파이프 | 파이썬 값 하나끼리 | Series끼리 칸별 계산(괄호 필수) | 032–033 |
sort_values vs sort_index | 값으로 정렬 | 인덱스(라벨)로 정렬 | 041, 045 |
rank(method="min") vs "dense" | 1, 1, 3 | 1, 1, 2 | 046 |
dropna vs fillna | 빈 값이 있는 행을 지움 | 빈 값을 다른 값으로 채움 | 053–057 |
size() vs count() | 그룹의 행 수(빈 값 포함) | 열별 유효 값 수(빈 값 제외) | 077 |
agg vs transform | 그룹 하나에 결과 하나(행 수 줄어듦) | 원래 행마다 결과(행 수 유지) | 074, 078 |
merge vs concat | 키 값으로 짝지어 붙임 | 순서·인덱스대로 이어 붙임 | 081–086 |
pivot vs pivot_table | 중복 없으면 모양만 바꿈 | 중복을 집계 함수로 합침 | 076, 088 |
cut vs qcut | 정한 경계값으로 | 인원이 비슷하도록 분위수로 | 091, 094 |
shift vs diff | 값을 한 칸 밀기 | 직전 값과의 차이 | 098 |
001–010 Series와 DataFrame 만들기
| 문법 | 하는 일 | 문제 |
|---|
pd.Series(리스트, index=[...]) | 값 목록에 이름표(인덱스)를 붙인 1차원 자료 | 001–002 |
pd.Series(딕셔너리, name=...) | 키가 인덱스, 값이 값 | 003 |
s.idxmax() / s.max() | 최댓값의 인덱스 / 최댓값 | 004 |
pd.DataFrame({열: [값...]}) | 열 단위 자료로 표 만들기 | 005 |
pd.DataFrame(행 리스트, columns=[...]) | 행 단위 자료로 표 만들기 | 006–007 |
df.shape | (행 수, 열 수) | 008 |
df.rename(columns={옛: 새}) | 열 이름 바꾸기(새 표 반환) | 009 |
df.set_index("열") | 열을 인덱스로 옮기기 | 010 |
문제 풀러 가기 →
011–020 데이터 살펴보기
| 문법 | 하는 일 | 문제 |
|---|
df.head(n) / df.tail(n) | 앞 / 뒤 n행 보기 | 011–012 |
df.columns.tolist() | 열 이름 리스트 | 013 |
df.dtypes | 열별 자료형 | 014 |
s.describe() | 개수·평균·표준편차·사분위수 요약 | 015 |
s.value_counts() | 값별 등장 횟수(많은 순) | 016 |
s.unique() / s.nunique() | 고유 값 목록 / 개수 | 017 |
s.mean(), s.max(), df[[...]].mean() | 평균·최댓값, 열별 평균 | 018–019 |
df.sample(n, random_state=0) | 무작위 n행(재현 가능) | 020 |
문제 풀러 가기 →
021–030 열과 행 선택하기
| 문법 | 하는 일 | 문제 |
|---|
df["열"] | 열 하나 → Series | 021 |
df[["열1", "열2"]] | 여러 열 → DataFrame | 022 |
df.loc[라벨] | 라벨로 행 하나 | 023 |
df.iloc[행 위치, 열 위치] | 위치로 고르기(끝 미포함) | 024 |
df.loc[행 라벨, [열 이름]] | 라벨로 고르기(끝 포함) | 025 |
df.at[라벨, "열"] | 값 하나 | 026 |
df.drop(columns="열") | 열 빼기(새 표 반환) | 027 |
df["새 열"] = 식 | 열 추가·덮어쓰기 | 028–029 |
문제 풀러 가기 →
031–040 조건으로 거르기
| 문법 | 하는 일 | 문제 |
|---|
df[df["열"] >= 값] | 조건에 맞는 행만 | 031 |
df[(조건1) & (조건2)] | 두 조건 모두(조건마다 괄호) | 032 |
| 파이프 기호로 묶기 | 조건 중 하나라도(또는) | 033 |
s.isin([...]) | 목록 중 하나인가 | 034 |
df[~조건] | 조건 뒤집기 | 035 |
df.query("kor > eng") | 문자열로 조건 쓰기 | 036 |
s.between(a, b) | a 이상 b 이하 | 037 |
s.str.contains("글자") | 글자가 들어 있나 | 038 |
조건.sum() | 조건에 맞는 개수 | 039 |
np.where(조건, 참값, 거짓값) | 조건으로 값 정하기 | 040 |
문제 풀러 가기 →
041–050 정렬과 순위
| 문법 | 하는 일 | 문제 |
|---|
df.sort_values("열", ascending=False) | 내림차순 정렬 | 041 |
sort_values([열1, 열2], ascending=[True, False]) | 여러 기준 정렬 | 042 |
df.nlargest(n, "열") / nsmallest | 상위 / 하위 n행 | 043–044 |
df.sort_index() / sort_index(axis=1) | 인덱스 순 / 열 이름 순 | 045, 050 |
s.rank(ascending=False, method="min") | 순위(동점은 같은 순위) | 046 |
df.groupby("반")["열"].rank(...) | 그룹 안 순위 | 047 |
df.reset_index(drop=True) | 인덱스 0부터 다시 | 048 |
df.loc[s.idxmax(), "name"] | 최댓값 행의 다른 열 값 | 049 |
문제 풀러 가기 →
051–060 결측치와 중복
| 문법 | 하는 일 | 문제 |
|---|
df.isna().sum() | 열별 결측치 수 | 051 |
df[df.isna().any(axis=1)] | 결측치가 있는 행 | 052 |
df.dropna() / dropna(subset=[열]) | 결측 행 지우기(전체 / 특정 열 기준) | 053–054 |
s.fillna(값) | 빈 값 채우기 | 055–056 |
s.fillna(df.groupby(g)[열].transform("mean")) | 그룹 평균으로 채우기 | 057 |
s.ffill() | 위 값으로 채우기 | 058 |
df.duplicated() | 앞에 같은 행이 있었나 | 059 |
df.drop_duplicates(subset=, keep=) | 중복 지우기 | 060 |
문제 풀러 가기 →
061–070 문자열과 날짜
| 문법 | 하는 일 | 문제 |
|---|
s.str.strip() / .str.lower() | 앞뒤 공백 제거 / 소문자 | 061 |
s.str.replace("-", "") | 글자 바꾸기 | 062 |
s.str.split("@").str[1] | 나눠서 n번째 조각 | 063 |
s.str.len() / .str.startswith() | 글자 수 / 시작 글자 검사 | 064–065 |
pd.to_datetime(s) | 날짜형으로 변환 | 066 |
s.dt.month / .dt.day_name() | 월 / 요일 이름 | 067 |
(날짜1 - 날짜2).dt.days | 날짜 차이(일) | 068 |
s.dt.to_period("M") | 연-월 단위로 묶기 | 070 |
문제 풀러 가기 →
071–080 그룹별 집계
| 문법 | 하는 일 | 문제 |
|---|
df.groupby("키")["열"].sum() | 그룹별 합계 | 071–072 |
.agg(["sum", "mean", "max"]) | 여러 집계 한 번에 | 073 |
.agg(새이름=("열", "함수")) | 이름 붙인 집계 | 074 |
groupby([키1, 키2])[열].sum().unstack() | 두 기준 집계를 표로 펼치기 | 075 |
df.pivot_table(index=, columns=, values=, aggfunc=) | 피벗 테이블 | 076 |
groupby("키").size() | 그룹별 행 수 | 077 |
groupby("키")[열].transform("sum") | 그룹 결과를 행마다 붙이기 | 078 |
groupby("키").filter(lambda g: ...) | 조건 맞는 그룹의 행만 | 079 |
df.loc[groupby("키")[열].idxmax()] | 그룹별 최댓값 행 | 080 |
문제 풀러 가기 →
081–090 합치기와 모양 바꾸기
| 문법 | 하는 일 | 문제 |
|---|
a.merge(b, on="키") | 공통 키로 합치기(inner) | 081 |
merge(..., how="left") | 왼쪽 행 모두 유지 | 082 |
merge(left_on=, right_on=) | 키 열 이름이 다를 때 | 083 |
merge(how="outer", indicator=True) | 전부 남기고 출처 표시 | 084 |
pd.concat([a, b], ignore_index=True) | 위아래로 붙이기 | 085 |
pd.concat([a, b], axis=1) | 옆으로 붙이기(인덱스 기준) | 086 |
df.melt(id_vars=, var_name=, value_name=) | 넓은 표 → 긴 표 | 087 |
df.pivot(index=, columns=, values=) | 긴 표 → 넓은 표 | 088 |
pd.crosstab(행, 열) | 교차표(빈도) | 089 |
df.explode("열") | 리스트를 행으로 펼치기 | 090 |
문제 풀러 가기 →
091–100 실전 종합
| 문법 | 하는 일 | 문제 |
|---|
pd.cut(s, bins=, labels=, include_lowest=True) | 경계값으로 구간 | 091 |
s.map({옛값: 새값}) | 값 바꿔 끼우기 | 092 |
df.idxmax(axis=1) | 행마다 최댓값의 열 이름 | 093 |
pd.qcut(s, 4, labels=) | 분위수로 구간 | 094 |
s.cumsum() | 누적 합계 | 095 |
s.rolling(3).mean() | 이동 평균 | 096 |
s.pct_change() | 직전 대비 변화율 | 097 |
s.shift(1) | 한 칸 밀기(전날 값) | 098 |
df.corr() | 상관계수 표 | 099 |
groupby().agg(이름=(열, 함수)) | 종합 리포트 | 100 |
문제 풀러 가기 →
보너스: 그래프
| 그래프 | 코드 | 문제 |
|---|
| 선 | df.plot(x=, y=, marker="o") | V01, V09 |
| 막대 / 가로 막대 | s.plot(kind="bar", rot=0) / kind="barh" | V02–V03 |
| 히스토그램 | s.plot(kind="hist", bins=...) | V04 |
| 상자그림 | df[[...]].plot(kind="box") | V05 |
| 산점도 | df.plot(kind="scatter", x=, y=) | V06 |
| 묶은 / 누적 막대 | 피벗표.plot(kind="bar", stacked=True) | V07–V08 |
| 여러 칸, 저장 | fig, axes = plt.subplots(1, 2), ax=axes[0], fig.savefig() | V10 |
| 한글 글꼴 | import koreanize_matplotlib | 보너스 준비 코드 |
그래프 문제 풀러 가기 →