내일배움캠프

[내일배움캠프] TIL 19일차 26.01.19(월)

nom_de_plume 2026. 1. 19. 17:03

SQL

INTERSECT:

- 두 개 이상의 SELECT 결과 중에서 공통으로 존재하는 행만 반환하는 집합 연산자

- 즉, 두 쿼리 결과의 교집합을 구할 때 사용

  • A 쿼리 결과 ∩ B 쿼리 결과
  • 중복 행은 자동으로 제거(DISTINCT)
  • 두 SELECT 결과에서 완전히 동일한 행만 반환
  • 컬럼 개수와 순서가 완전히 동일해야 사용 가능
  • 각 컬럼의 데이터 타입도 호환되어야 함
  • ORDER BY는 마지막 SELECT 뒤에서만 사용 가능
SELECT column1, column2
FROM table_a

INTERSECT

SELECT column1, column2
FROM table_b;

 

 

Pandas

1. 데이터 탐색 / 요약

.describe():

- 기초 통계량 확인

- 숫자형: count, mean, std, min, 25%, 50%, 75%, max

df.describe()

- include="all" 옵션:

  • 모든 열에 대해 요약 통계량 출력
  • 출력 항목: 총 개수, 고유값 개수, 최빈값, 최빈값 빈도수
df.describe(include="all")

 

.value_counts():

- 각 고유값의 빈도수 계산

df["category"].value_counts()

 

.mode():

- 최빈값 반환

df["category"].mode()

 

2. 결측치 처리

.isnull() / .isna():

- 데이터가 결측치(NaN, None) 여부 확인 (True / False)

- 반환값, 처리대상, 동작 방식 모두 동일

  • .isna(): R 기반
  • .isnull(): Numpy 기반
df.isnull()
df.isna()

 

.isna().sum():

- 열별 결측치 개수 확인

df.isna().sum()

 

.fillna():

- 결측치 대체

df["score"].fillna(0)

 

.dropna(subset=[열이름1,열이름2]): 

- 결측치 제거

- 특정 열들에 결측치가 있는 행 제거

df.dropna(subset=["col1", "col2"])

 

3. 정렬 / 필터링

.sort_values(ascending=False):

- 내림차순 데이터 정렬

- ascending =

  • True: 오름차순
  • False: 내림차순
df.sort_values(by="score", ascending=False)

 

.sort_values(by=열이름, ascending=오름차순여부):

- 여러 열 기준 정렬

df.sort_values(
    by=["col1", "col2"],
    ascending=[True, False]
)

- by=[열1,열2], ascending=[True,False]

  • 열1은 오름차순
  • 열2는 내림차순

 

.isin():

- 특정 값이 포함된 행 필터링

- 괄호 안에 있는 값이 포함되면 True, 아니면 False 반환

df[df["grade"].isin(["A", "B"])]

 

4. 데이터 타입 변환

.astype("string"):

- 문자열 타입으로 변환

- .astype("str")과 동일

df["name"] = df["name"].astype("string")

 

pd.to_numeric():

- 숫자 타입으로 변환

pd.to_numeric(df["price"], errors="coerce")
  • errors="coerce" 옵션: 변환 불가능한 값을 빈 값(NaT) 처리

 

pd.to_datetime():

- 날짜 타입으로 변환

pd.to_datetime(df["date"], errors="coerce", format="mixed")
  • errors="coerce" 옵션: 변환 불가능한 값을 빈 값(NaT) 처리
  • format="mixed" 옵션: 여러 형식의 날짜 문자열을 자동으로 인식하여 변환

 

5. 문자열 처리 (.str)

.str.replace():

- 문자열 치환

df["text"].str.replace(",", "", regex=False)
  • regex=False 옵션: 정규표현식이 아닌 일반 문자열로 인식

 

.str.title():

- 각 단어의 첫 글자만 대문자로 변환

df["name"].str.title()

 

.str.strip():

- 문자열 양쪽 공백 제거

df["name"].str.strip()

 

.str.lower():

문자열을 소문자로 변환

df["name"].str.lower()

 

6. 그룹화 / 집계

.groupby():

- 그룹화 후 집계

df.groupby("category")["price"].mean()

 

7. 시각화 (Seaborn / Pandas)

.countplot(): 

 - 범주형 데이터 막대 그래프 그리기

sns.countplot(data=df, x="category")

 

.histplot():

- 히스토그램 그리기

- 분포 확인

sns.histplot(df["score"])

 

.barplot():

- 막대 그래프와 평균값 그리기

sns.barplot(data=df, x="category", y="score")
  • 오차선(error bar): 신뢰구간 의미

 

.plot(kind="bar"):

- 막대 그래프 그리기

- Pandas 기본 막대 그래프

df["category"].value_counts().plot(kind="bar")

 

8. 데이터 가공

pd.cut(값, bins=구간, labels=이름):

- 연속형 데이터를 구간으로 나누기

pd.cut(
    df["score"],
    bins=[0, 60, 80, 100],
    labels=["낮음", "보통", "높음"]
)
  • bins: 각 구간의 시작과 끝
  • labels: 각 구간에 부여할 이름(구간 개수와 이름 개수 일치해야 한다.)

 

pd.get_dumies():

- 원-핫 인코딩

- 하나의 값을 여러 개의 0과 1로 바꾸는 방법

pd.get_dummies(df["gender"])

 

9. 행 / 열 조작

.drop():

- 열 또는 행 제거

df.drop(columns=["col1"])
df.drop(index=0)

 

.rename(columns={기존이름:새이름}):

- 열 이름 변경

df.rename(columns={"old": "new"})

 

.duplicated():

- 중복된 행 여부 확인

df.duplicated()
  • 중복되면 True, 아니면 False

 

.drop_duplicated(keep="first"):

- 중복된 행 중 첫 번째 행만 남기고 제거

df.drop_duplicates(keep="first")


.copy():

- 원본 데이터프레임과 독립적인 복사본 생성

df_copy = df.copy()

 

10. 인덱싱

.loc():

- 인덱스 라벨 기반

df.loc[0:3, "name"]
  • 끝 포함

 

.iloc():

- 인덱스 위치 기반

df.iloc[0:3, 0]
  • 끝 미포함

 

11. 파일 저장

.to_csv():

- csv 파일로 저장

df.to_csv(
    "data.csv",
    index=False,
    encoding="utf-8-sig"
)
  • index=False 옵션: 인덱스 열 제외
  • encoding="utf-8-sig" 옵션: 한글 깨짐 방지

 

.to_json():

- json 파일로 저장

df.to_json(
    "data.json",
    orient="records",
    force_ascii=False,
    indent=2
)
  • orient="records" 옵션: 레코드 지향 형식으로 저장
  • force_ascii=False 옵션: 한글 깨짐 방지
  • indent=2: 들여쓰기 2칸 설정

오늘 한 일

- SQL, Python 코드카타

- 전처리 세션 코드 복습

- 전처리 세션 녹강 수강

 

오늘의 회고:

이번주 금요일에 시험이 있다는 것을 알게 되었다. 뭔가 SQL때처럼 해냈다는 느낌이 오지 않은 상태에서 나아가는 느낌이다. 보고 또 봐도 문제만 보면 머리가 새하얘진다. 이해도 문제인가.. 싶다. 내일은 전처리 녹화강의를 보고, 파이썬 세션 연습문제를 풀어볼 것이다.