본문 바로가기

DATA/Python

DA를 위한 Pandas 학습 기록

Python 독학 데이터 애널리스트(DA)를 위한 Pandas 학습 기록

안녕하세요! 오늘은 Pandas를 활용해 데이터 다루는 법을 공부하면서 배운 내용을 정리해보려고 합니다.
이 글은 저처럼 Python을 독학하는 데이터 애널리스트(DA) 지망생을 위한 것이며, 제가 직접 궁금했던 부분과 해결한 과정을 공유합니다! 

 1. Pandas에서 데이터 개수 세기 (value_counts() vs shape)

데이터 분석을 할 때, 특정 컬럼에 있는 값들의 개수를 세야 할 때가 많습니다.
처음엔 value_counts()와 shape의 차이를 명확히 몰랐는데, 공부하면서 이해하게 된 내용입니다.

📍 value_counts()를 활용한 개수 세기

import pandas as pd

df = pd.read_csv('data/enrolment_1.csv')  # 예제 데이터
city_counts = df['City / Urban area'].value_counts()
print(city_counts)

각 도시별 등장 횟수를 보여줌

Seoul      10
New York    8
Tokyo       5

📍 shape를 활용해 고유값 개수 세기

print(df['City / Urban area'].value_counts().shape)

➡ (249,)

  • .shape를 사용하면 고유한 도시 개수(중복 제외) 를 알 수 있음!

배운 점

- value_counts()는 각 항목별 개수를 세고,
- .shape를 사용하면 고유한 값이 몇 개인지 알 수 있음!
- df['컬럼명'].nunique()를 쓰면 더 직관적으로 고유값 개수를 알 수 있음!


2. Pandas에서 조건을 만족하는 값 변경하기 (df.loc[])

오늘 배운 또 하나의 핵심은 특정 조건을 만족하는 행을 찾아서 값을 바꾸는 방법입니다.
데이터를 다룰 때 특정 조건을 적용해야 할 때가 많아요!

📍 조건을 활용한 값 변경

df.loc[df['year'] == 1, 'status'] = 'not allowed'  # 1학년은 수강 불가
df.loc[(df['year'] == 4) & (df['course name'] == 'commerce'), 'status'] = 'not allowed'  # 4학년 상경계열 제한

조건에 맞는 행들의 값을 한 번에 변경 가능!

배운 점

- df.loc[조건, '변경할 컬럼'] = '변경 값' 형태로 사용
- &, | 연산자를 사용할 때는 반드시 괄호로 묶기
- 특정 컬럼이 특정 값 목록에 속하는지 확인할 땐 isin() 활용

df.loc[df['course name'].isin(['math', 'physics']), 'status'] = 'not allowed'

math나 physics 과목이면 수강 불가로 설정!


3. value_counts() 결과를 리스트로 변환해 활용하기

수강신청 데이터에서 강의실을 배정하는 작업을 하다가 배운 개념입니다.
처음엔 헷갈렸는데, value_counts() 결과에서 .index를 쓰면 고유한 값 목록을 가져올 수 있어요.

📍 value_counts().index 사용 예시

course_counts = df.loc[df['status'] == 'allowed', 'course name'].value_counts()

# 수강 인원이 80명 이상인 과목을 리스트로 변환
auditorium_list = list(course_counts[course_counts >= 80].index)

이렇게 하면 80명 이상 수강하는 과목의 리스트를 만들 수 있음!

배운 점

- value_counts()는 Series 형태라서, .index를 쓰면 고유한 값 목록을 리스트로 변환 가능
- list(df['컬럼명'].unique())도 비슷한 역할을 함!


4. apply() 대신 벡터 연산 사용하기 (속도 최적화)

처음엔 apply()가 편해서 자주 썼는데, 속도가 너무 느려지는 문제가 있었어요.
벡터 연산을 사용하면 훨씬 빠르게 작업할 수 있었습니다.

📍 apply() 사용 (비효율적)

df['discounted_price'] = df.apply(lambda x: x['price'] * 0.9, axis=1)

➡ 행을 하나씩 처리하므로 속도가 느림

📍 벡터 연산 사용 (효율적)

df['discounted_price'] = df['price'] * 0.9

벡터 연산을 활용하면 속도가 수십 배 증가! 🚀 배운 점

- apply()는 가능하면 피하고 벡터 연산 사용!
- Pandas는 배열 연산이 최적화되어 있어서 훨씬 빠름


5. to_csv()를 사용할 때 chunksize 활용

데이터를 저장할 때도 메모리를 고려해야 합니다.
오늘 배운 팁 중 하나는 큰 데이터를 저장할 때 chunksize를 사용하면 부담이 줄어든다는 것.

df.to_csv('processed_data.csv', index=False, chunksize=5000)

 chunksize=5000 → 한 번에 5000개씩 저장해서 메모리 절약!


 오늘 배운 핵심 정리

1️⃣ 데이터 개수 세기 → value_counts(), .shape, .nunique() 활용
2️⃣ 조건을 만족하는 값 변경 → df.loc[] 활용 (괄호 주의)
3️⃣ value_counts().index로 고유값 리스트 만들기 → list(df['컬럼명'].unique())도 가능
4️⃣ 연산 최적화 → apply() 대신 벡터 연산 사용 (속도 수십 배 차이)
5️⃣ CSV 저장 시 chunksize 활용 → 메모리 부담 줄이기

 

728x90