본문 바로가기
두두 IT/파이썬

[PYTHON-Pandas 02-01] 데이터 분석의 꽃, DataFrame 완벽 정복!

by DoDo's 2026. 5. 4.
반응형

🐼 [Pandas 복습 노트] 데이터 분석의 꽃, DataFrame 완벽 정복하기!

데이터 분석을 시작하셨다면 절대 피할 수 없는, 그리고 가장 사랑하게 될 도구! 바로 Pandas(판다스)입니다.

그중에서도 엑셀(Excel)과 똑같이 생긴 DataFrame(데이터프레임)은 판다스의 핵심 중의 핵심이죠.


💡 1. DataFrame(데이터프레임)이란?

쉽게 말해 '파이썬으로 다루는 엑셀 표'입니다. 행(Row)과 열(Column)로 이루어진 2차원 데이터 구조죠.

  • Index (인덱스): 행의 이름표 (가로줄)
  • Column (컬럼): 열의 이름표 (세로줄)
  • Series (시리즈): DataFrame을 이루는 하나의 열(또는 행). 즉, 1차원 데이터들이 모여서 2차원 DataFrame이 됩니다.

🛠️ 데이터프레임 직접 만들기

가장 많이 쓰이는 방법은 파이썬의 딕셔너리(Dictionary)를 활용하는 것입니다.

Python
import pandas as pd

# 딕셔너리의 key가 '컬럼명', value가 '데이터 리스트'가 됩니다.
data = {
    "id": ["id-1", "id-2", "id-3"],
    "korean": [100, 50, 70],
    "english": [90, 80, 100]
}

df = pd.DataFrame(data)
print(df)

💾 2. 데이터 저장하고 불러오기

매번 데이터를 손으로 칠 수는 없죠? 파일로 저장하고, 외부 파일을 불러오는 핵심 명령어입니다.

📥 불러오기 (read_~)

  • pd.read_csv('파일경로.csv'): CSV 파일을 읽어옵니다. 가장 많이 씁니다!
    • 꿀팁 파라미터:
      • index_col=0: 0번째 컬럼을 인덱스(행 이름표)로 쓰겠다는 뜻입니다.
      • na_values=['모름', '?']: 데이터 중에 '모름'이나 '?'라고 적힌 값들을 진짜 빈칸(NaN, 결측치)으로 인식해서 가져옵니다.
  • pd.read_excel('파일경로.xlsx'): 엑셀 파일을 읽어옵니다.
  • pd.read_sql(query, con=engine): 데이터베이스(DB)에서 쿼리문을 날려 바로 표로 가져옵니다.

📤 저장하기 (to_~)

  • 🚨 주의: index=False를 안 쓰면 0, 1, 2... 순번이 새로운 데이터로 같이 저장되어 버려요. 꼭 적어주세요!
  • df.to_csv('저장경로.csv', index=False):

🔍 3. 데이터프레임 파악하기 (데이터 첫인상 보기)

데이터를 처음 불러오면 무작정 분석하기 전에 데이터가 어떻게 생겼는지 파악해야 합니다.

  • df.head() / df.tail(): 데이터의 맨 위(head) 5줄, 맨 아래(tail) 5줄을 보여줍니다. 데이터가 잘 들어왔나 확인할 때 씁니다.
  • df.shape: (행 개수, 열 개수)를 알려줍니다. 데이터의 크기 파악!
  • df.info(): 데이터의 총 개수, 결측치(빈칸) 여부, 각 컬럼의 데이터 타입(문자인지 숫자인지)을 한눈에 보여줍니다. (가장 중요!)
  • df.describe(): 수치형 데이터들의 통계값(평균, 최소/최대, 25/50/75% 값)을 쫙 뽑아줍니다.
  • df.isnull().sum(): 컬럼별로 빈칸(결측치)이 몇 개인지 세어줍니다.

🏷️ 4. 행/열 이름표(Index/Column) 마음대로 바꾸기

  • 이름 확인: df.columns (컬럼명 확인), df.index (인덱스 확인)
  • 이름 변경 (rename):
     
    Python
    # 원본을 진짜로 바꾸려면 inplace=True를 써주세요!
    df.rename(columns={"korean": "국어", "english": "영어"}, inplace=True)
    
  • 특정 컬럼을 인덱스로 만들기 (set_index): 기본 인덱스(0, 1, 2...) 대신 'id' 같은 컬럼을 인덱스로 격상시킵니다. df.set_index("id", inplace=True)
  • 인덱스를 다시 컬럼으로 내리기 (reset_index): df.reset_index(drop=True): 여기서 drop=True를 쓰면 기존 인덱스는 컬럼으로 가지 않고 아예 삭제됩니다.

✂️ 5. 데이터 삭제와 추가

🗑️ 삭제하기 (drop)

  • 행 삭제: df.drop(index=['id-1', 'id-2'])
  • 열 삭제: df.drop(columns=['국어', '영어'])
    • (참고) axis=0은 행을 의미하고, axis=1은 열을 의미합니다.

➕ 추가하기

  • 열(파생변수) 추가: 엑셀에서 수식 거는 것과 같습니다.
    맨 끝에 열이 추가됩니다. df['총점'] = df['국어'] + df['영어']
  • 원하는 위치에 열 삽입: df.insert(1, "수학", 100) -> 1번 위치(두 번째)에 '수학' 컬럼을 100점으로 다 채워 넣습니다.
  • 행 추가: df.loc['id-6'] = [70, 100, 80]

🎯 6. 원하는 데이터만 쏙쏙! (데이터 인덱싱 & 슬라이싱)

이 부분이 판다스에서 제일 헷갈리면서도 제일 많이 쓰는 부분입니다! 별표 백 개! ⭐⭐⭐

① 컬럼(열)만 가져오기

  • 한 개: df['국어']
  • 여러 개 (팬시 인덱싱): df[['국어', '영어']] (반드시 대괄호 [[ ]] 두 개를 써야 표 형태로 나옵니다!)

② 특정 행 가져오기 (loc vs iloc)

이전 질문에서도 다루었죠?

  • loc (Location - 이름 기반): 눈에 보이는 이름표로 찾습니다.df.loc['id-3'] (인덱스 이름이 'id-3'인 행 찾기)
  • iloc (Integer Location - 순서 기반): 컴퓨터가 세는 0, 1, 2... 순서대로 찾습니다.df.iloc[2] (위에서 3번째 줄 찾기)

③ 조건으로 찾기 (Boolean Indexing & Query)

 

가장 많이 쓰는 기술! "국어 점수가 80점 이상인 사람만 보여줘"

  • 전통적인 방법 (불리언 인덱싱): 코드가 좀 깁니다. df[ df['국어'] >= 80 ] 조건이 여러 개면 괄호로 묶고 &(and), |(or)를 씁니다. df[ (df['국어'] >= 80) & (df['영어'] >= 90) ]
  • 우아한 방법 (query): SQL이나 영어 문장처럼 씁니다. 훨씬 깔끔하죠! df.query("국어 >= 80") df.query("국어 >= 80 and 영어 >= 90") df.query("name == '김영수'") (글자는 작은따옴표로 묶습니다)

🔍 .filter(regex="정규표현식") 완벽 해독하기

데이터프레임에서 컬럼 이름의 특정 '패턴'을 찾아서 해당 열들만 걸러내는 기능입니다.

 

1. grade3.filter(regex=r"\d$")

이 코드는 "이름이 숫자로 끝나는 컬럼들만 다 가져와!"라는 뜻입니다.

  • \d: 숫자 1개를 의미합니다.
  • $: 문자의 '끝'을 의미합니다.
  • 해석: 끝($)이 숫자(\d)로 끝나는 패턴. (예: math2, korean2, korean3 등)

2. grade3.filter(regex=r"^\w{4}$")

이 코드는 "이름이 딱 4글자인 컬럼들만 다 가져와!"라는 뜻입니다.

  • ^: 문자의 '시작'을 의미합니다.
  • \w: 교재 기준으로는 '정수 또는 글자 또는 공백'을 의미합니다. (일반적으로는 알파벳, 숫자, 언더바(_)를 의미해요!)
  • {4}: 바로 앞의 조건이 딱 '4글자'라는 뜻입니다.
  • $: 문자의 '끝'을 의미합니다.
  • 해석: 시작(^)부터 끝($)까지 글자(\w)가 딱 4개({4})인 패턴. (예: math, name 등)

💡 요약: filter 메서드의 3가지 무기

이참에 교재에 나온 filter의 3가지 방법을 한 번에 정리해 드릴게요! (이 세 가지는 한 번에 하나씩만 써야 합니다)

  1. items (정확히 일치): 내가 적은 이름과 똑같은 컬럼만 찾기
    • df.filter(items=["math", "music"])
  2. like (부분 일치): 특정 단어가 포함된 컬럼 찾기
    • df.filter(like="math") ('math2', 'math_score' 등 math가 들어간 것 다 찾음)
  3. regex (패턴 일치): 위에서 배운 정규표현식 패턴으로 찾기

📝 7. 실력 점검 복습 퀴즈!

배운 내용을 토대로 직접 풀어보세요. (정답은 맨 아래에 드래그하면 볼 수 있게 해두었습니다!)

📌 [객관식 문제]

Q1. CSV 파일을 읽어올 때, 0번째 컬럼을 데이터프레임의 인덱스(행 이름)로 사용하고 싶습니다. 알맞은 파라미터는?

  1. header=0
  2. index=False
  3. index_col=0
  4. sep=','

Q2. 데이터프레임 df의 전반적인 정보(행/열 개수, 데이터 타입, 결측치 수)를 한 번에 확인하는 메서드는?

  1. df.head()
  2. df.describe()
  3. df.shape()
  4. df.info()

Q3. 다음 중 loc와 iloc에 대한 설명으로 틀린 것은?

  1. loc는 눈에 보이는 행/열의 '이름(라벨)'을 기준으로 데이터를 찾는다.
  2. iloc는 데이터의 물리적인 '순번(0부터 시작)'을 기준으로 찾는다.
  3. df.iloc[0:3]을 실행하면 0번, 1번, 2번, 3번 행까지 총 4줄이 출력된다.
  4. df.loc['a':'c']로 슬라이싱하면 'c'라는 이름을 가진 행까지 포함되어 출력된다.

Q4. DataFrame의 원본 데이터를 실제로 변경하도록 적용하기 위해 메서드 안에 넣는 파라미터는 무엇인가요?

  1. update=True
  2. inplace=True
  3. axis=1
  4. drop=True

Q5. 나이(age)가 25세 이상이고 이름(name)이 '김영수'인 사람을 .query() 메서드로 올바르게 조회한 코드는?

  1. df.query(age >= 25 & name = 김영수)
  2. df.query("age >= 25 and name == '김영수'")
  3. df.query(age >= 25 and name == 김영수)
  4. df.query("age >= 25 & name = '김영수'")

✍️ [주관식/코딩 문제]

Q1. grade라는 데이터프레임을 CSV 파일(이름: result.csv)로 저장하려고 합니다. 이때 인덱스 이름(0,1,2..)은 저장되지 않도록 하는 파이썬 코드를 작성하세요.

Q2. df 데이터프레임에서 '수학'이라는 열을 완전히 삭제하고 싶습니다. 코드를 작성하세요. (원본은 변경하지 않고 결과만 출력되게 하세요)

Q3. df에 '국어', '영어' 컬럼이 있습니다. 이 두 컬럼의 값을 더해서 '총점'이라는 새로운 파생변수(새로운 열)를 맨 우측에 추가하는 코드를 작성하세요.

Q4. '학생 아이디'라는 이름의 컬럼을 해당 데이터프레임의 '인덱스(행 이름)'로 설정하는 코드를 작성하세요. (원본을 바로 변경하세요)

Q5. df에서 인덱스(행) 순번이 위에서부터 3번째(컴퓨터 기준 2번)인 행의 데이터를 가져오려고 합니다. 알맞은 인덱서(loc 또는 iloc)를 사용해 코드를 작성하세요.



💡 [정답 확인란]

(아래 빈칸을 드래그하거나 스크롤해서 정답을 확인하세요!)

객관식 정답:

  1. 정답: 3번 (index_col=0. index=False는 저장할 때 인덱스를 뺄 때 씁니다)
  2. 정답: 4번 (info()가 타입과 결측치를 한방에 보여줍니다)
  3. 정답: 3번 (iloc에서 슬라이싱 0:3을 하면 3번 앞인 2번까지만 나옵니다. 0, 1, 2가 출력됩니다.)
  4. 정답: 2번 (inplace=True)
  5. 정답: 2번 (문자열 조건을 쓸 땐 전체를 큰따옴표로, 안의 문자는 작은따옴표로 묶고 = 대신 ==를 씁니다.)

주관식 정답:

  1. grade.to_csv('result.csv', index=False)
  2. df.drop(columns=['수학']) (또는 df.drop('수학', axis=1))
  3. df['총점'] = df['국어'] + df['영어']
  4. df.set_index('학생 아이디', inplace=True)
  5. df.iloc[2]

어떠신가요? 이제 Pandas 데이터프레임을 다루는 데 자신감이 조금 붙으셨나요? 데이터 분석의 8할은 데이터 전처리(데이터 예쁘게 다듬기)라고 합니다. 오늘 배운 내용들을 손에 익히시면 분석 속도가 엄청나게 빨라질 거예요! 화이팅입니다! 👏

반응형