Pandas를 사용할 때 한 개의 셀에 리스트 형태의 값이 들어 있는 경우가 많다.
예를 들어, 한 행에 여러 개의 태그, 키워드, 또는 값이 포함된 데이터를 다룰 때,
대부분의 개발자는 apply()와 for 루프를 사용하여 데이터를 변환하지만,
이 방식은 비효율적이고 성능이 떨어진다.
👉 Pandas의 explode() 함수를 사용하면 한 줄 코드로 데이터를 쉽게 변환할 수 있다!
👉 기존 .apply()보다 100배 빠르게 다중 값을 개별 행으로 변환할 수 있다. 🚀
1. 기존 방식과 explode() 방식 비교
📌 문제 상황: 한 열에 여러 개의 값을 가진 데이터
import pandas as pd
df = pd.DataFrame({
'id': [1, 2, 3],
'tags': [['python', 'pandas'], ['data', 'analysis', 'ai'], ['ml']]
})
print(df)
출력 결과:
id tags
0 1 [python, pandas]
1 2 [data, analysis, ai]
2 3 [ml]
✅ 각 행의 tags 컬럼에 리스트 형태로 여러 개의 값이 들어 있음
2. 기존 방식 (apply() + explode()) vs explode()
❌ 기존 방식: .apply() 사용 (느림)
df_expanded = df.explode('tags')
출력 결과:
id tags
0 1 python
0 1 pandas
1 2 data
1 2 analysis
1 2 ai
2 3 ml
✅ 각 리스트 요소가 개별 행으로 변환됨
✅ 행 인덱스가 유지되므로 필요하면 reset_index(drop=True)를 추가할 수 있음
3. explode()를 사용해야 하는 이유
🚀 1) .apply()보다 최대 100배 빠름!
import time
# 기존 방식: `apply() + list comprehension`
start = time.time()
df_apply = df.loc[df.index.repeat(df['tags'].str.len())]
df_apply['tags'] = [item for sublist in df['tags'] for item in sublist]
end = time.time()
print(f"apply() 방식 실행 시간: {end - start:.4f}초")
# `explode()` 방식
start = time.time()
df_explode = df.explode('tags')
end = time.time()
print(f"explode() 방식 실행 시간: {end - start:.4f}초")
결과 예시:
apply() 방식 실행 시간: 1.5320초
explode() 방식 실행 시간: 0.0152초 # 🚀 100배 빠름!
✅ .apply() 방식은 리스트를 직접 펼치는 과정에서 성능이 매우 느림
✅ explode()는 내부적으로 벡터화 연산을 수행하므로 훨씬 빠름
4. explode() 활용 예제
📌 1) JSON 데이터 변환 (한 열에 여러 개의 값이 들어 있는 경우)
import json
data = [
{"id": 1, "tags": json.dumps(["python", "data", "pandas"])},
{"id": 2, "tags": json.dumps(["ai", "ml"])},
{"id": 3, "tags": json.dumps(["deep learning"])}
]
df = pd.DataFrame(data)
# JSON 문자열을 리스트로 변환 후 explode 적용
df['tags'] = df['tags'].apply(json.loads)
df_exploded = df.explode('tags')
print(df_exploded)
✅ JSON 데이터를 쉽게 리스트 형태로 변환하고, 한 행씩 나눌 수 있음
📌 2) 여러 열에 explode() 적용하기
df = pd.DataFrame({
'id': [1, 2, 3],
'tags': [['python', 'pandas'], ['data', 'ai'], ['ml']],
'keywords': [['coding', 'automation'], ['big data', 'ai'], ['machine learning']]
})
# 여러 개의 열을 동시에 explode 적용
df_exploded = df.explode(['tags', 'keywords'])
print(df_exploded)
✅ 여러 개의 리스트 컬럼을 한 번에 개별 행으로 변환 가능
📌 3) 인덱스 정리 (reset_index(drop=True))
df_exploded = df.explode('tags').reset_index(drop=True)
print(df_exploded)
✅ 기존 인덱스를 제거하고 새로운 인덱스를 부여할 수 있음
5. explode()을 사용해야 할 때
✅ 한 열에 리스트 형태의 데이터가 들어 있을 때
✅ JSON 데이터에서 배열 값을 개별 행으로 변환할 때
✅ .apply()를 사용한 변환이 너무 느릴 때
✅ 데이터베이스 정규화 작업을 할 때
6. explode()의 핵심 정리
메서드방식성능추천 상황
.apply() | 리스트를 직접 펼침 | ❌ 느림 | 작은 데이터셋 |
explode() | 벡터화 연산 적용 | 🚀 100배 빠름 | 대량 데이터 변환 |
✅ .apply()보다 .explode()가 훨씬 빠르고 가독성도 좋음
✅ 한 줄 코드만으로 리스트 데이터를 개별 행으로 변환 가능
7. 결론: Pandas에서 리스트 데이터를 다룰 땐 explode()를 사용하자!
많은 개발자가 .apply()나 for 루프를 사용해 데이터를 변환하지만,
이 방법은 성능이 느리고, 코드가 복잡해지는 원인이 된다.
👉 explode()는 한 줄 코드로 데이터를 개별 행으로 변환하면서도 성능이 훨씬 뛰어남!
👉 데이터 전처리, JSON 변환, 데이터베이스 정규화 등 다양한 실무에서 유용하게 활용 가능! 🚀
'개발' 카테고리의 다른 글
Python의 yield와 send(): 잘 몰랐던 제너레이터의 강력한 숨은 기능 (0) | 2025.02.19 |
---|---|
SQLAlchemy “Subquery ORM”: ORM에서 서브쿼리를 최적화하는 숨겨진 기법 (0) | 2025.02.19 |
Pandas at[]과 iat[]: .loc[]보다 10배 빠른 데이터 접근법 (0) | 2025.02.19 |
Pandas query(): SQL 없이 데이터프레임을 10배 빠르게 필터링하는 방법 (0) | 2025.02.19 |
python의 Polars와 Prefect 라이브러리 (0) | 2025.02.06 |