학습/데이터 분석

Pandas 기초 정리

DataJ 2025. 5. 14. 11:56

1️⃣ 데이터 준비 및 구조 이해

✅ 데이터셋 준비하기

import pandas as pd

df = pd.read_csv('sample.csv')  # CSV 파일 불러오기
df.head()  # 상위 5개 행 출력

✅ 데이터프레임 구조 가볍게 보기

df.shape       # (행, 열) 확인
df.columns     # 컬럼명 확인
df.info()      # 데이터 타입, 결측치 확인

2️⃣ 인덱싱 및 조회

✅ 행 조회 (loc, iloc, slicing)

df.loc[0]               # 라벨 기준 첫 번째 행
df.iloc[0]              # 위치 기준 첫 번째 행
df[3:6]                 # 슬라이싱 (3 ~ 5행

3️⃣ Series가 중요한 이유

  • Series는 Pandas의 1차원 자료구조
  • DataFrame의 각 열은 Series로 구성됨
type(df['Age'])   # pandas.core.series.Series

4️⃣ 기술통계 describe()

df.describe()

결과:

Age Income

count 100 100
mean 45.3 56000
std 12.4 15400
min 20 21000

5️⃣ 문자열 탐색: .str.contains()와 인덱싱

df[df['Job'].str.contains('Engineer')]

6️⃣ 수치 탐색과 산술연산

df['Income'] + 1000       # 소득 증가
df['Rate'] * 0.1          # 비율 계

7️⃣ DataFrame 생성

data = {'Name': ['A', 'B'], 'Age': [25, 30]}
df = pd.DataFrame(data

8️⃣ apply()와 주의사항

df['Age_category'] = df['Age'].apply(lambda x: 'young' if x < 30 else 'adult')

⚠️ apply()는 행/열 단위로 연산 가능하지만, 성능상 주의 필요

import pandas as pd

df = pd.DataFrame({
    'Name': ['Alice', 'Bob', 'Charlie', 'David'],
    'Age': [25, 32, 18, 45]
})
df['Age_category'] = df['Age'].apply(lambda x: 'young' if x < 30 else 'adult')

#결과
'''   Name  Age Age_category
0    Alice   25        young
1      Bob   32        adult
2  Charlie   18        young
3    David   45        adult
'''

#활용
def age_group(x):
    if x < 20:
        return 'teen'
    elif x < 40:
        return 'young adult'
    elif x < 60:
        return 'middle-aged'
    else:
        return 'senior'

df['Age_category'] = df['Age'].apply(age_group)

9️⃣ 결측치 처리 (fillna, dropna)

df.fillna(0)                              # 결측값을 0으로 대체
df.dropna()                               # 결측치 포함 행 제거
df.fillna(method='ffill', limit=1)        # 앞값으로 채우기 (1회 한정
df.dropna(how='any')                         # 하나라도 NaN이 있으면 제거
df.dropna(subset=['Age', 'Income'])          # Age 또는 Income이 NaN인 행만 제거
  • how='any': 하나라도 NaN이면 제거
  • subset=[열목록]: 특정 열 기준으로만 판단

🔟 형변환 및 결측치 처리

df['Age'] = df['Age'].astype(int)         # 형변환

🔢 집계 함수와 인자

df['Income'].quantile(0.25)  # 1사분위수
df['Age'].mean()

다양한 분위수(percentiles) 및 범주형 포함 통계 요약 제공

df.describe(percentiles=[.25, .5, .75], include='all')
df.quantile(0.9, numeric_only=True)
  • percentiles: 사분위 수 지정 (.25=1사분위, .5=중앙값, .75=3사분위 등)
  • include='all': 수치형 외 범주형도 요약
  • numeric_only=True: 수치형 컬럼만 계산

🔢 정렬 (sort_values, nlargest 등)

df.sort_values(by='Age', ascending=True) #전체정렬 필요할때
df.nlargest(3, 'Income')     # 상위 3명 #위 함수보다 속도 빠르고 간단

데이터프레임에서 값 기준 정렬 또는 최댓값/최솟값 추출

df['Income'].nlargest(5)         # 소득 상위 5명
df['Age'].nsmallest(3)           # 나이 하위 3명
df.sort_values(by='Age', ascending=False)  # 나이 내림차순 정렬
  • nlargest(n), nsmallest(n): 빠르게 상위/하위 추출
  • sort_values(by=컬럼명): 정렬 기준 설정

🔢 인덱스 제어

df = df.set_index('ID')        # 특정 열을 인덱스로
df = df.reset_index(drop=True) # 인덱스 초기화

🔢 행/열 추가 및 삭제

df.drop([0, 1], errors='ignore')  # 행 삭제
#인덱스가 0번과 1번인 행을 삭제
#errors='ignore'는 삭제하려는 인덱스가 없어도 에러가 나지 않게 해줌

df['NewCol'] = df['Age'] + 10     # 열 추가

df.insert(1, 'Flag', True)        # 특정 위치에 열 삽입 
# DataFrame의 두 번째 열 위치(인덱스 1)에, 'Flag'라는 이름의 열을 추가하고, 모든 값을 True로 채움

✂️ 열 조건부 제거 (dropna with subset)

df.dropna(subset=['Age'])  # 특정 컬럼 기준 결측치 제거

📌 요약 표

기능 함수 주요 예시

행 조회 loc, iloc df.loc[0], df.iloc[3:5]
결측치 처리 fillna, dropna df.fillna(0), df.dropna()
정렬 sort_values, nlargest df.sort_values(by='Age')
인덱스 설정 set_index, reset_index df.set_index('ID')
열 조작 insert, 연산 df['New'] = df['Age'] + 1, df.insert(...)
형 변환 astype() df['Age'].astype(int)
집계 함수 mean(), quantile() df['Income'].mean()