본문으로 건너뛰기
김신건의 로그

[Pandas] explode

· 수정 · 📖 약 1분 · 170자/단어 #python #pandas #explode #reshape
Pandas explode, DataFrame.explode, list 컬럼 펼치기

정의

explode(column) 는 list / set / tuple 등의 시퀀스 값을 가진 컬럼을 각 원소가 별도 행 이 되도록 펼친다.

JSON / 로그 / 다중 태그 데이터 처리의 핵심.

기본

python
import pandas as pd
df = pd.DataFrame({
  'user': ['Alice', 'Bob', 'Charlie'],
  'tags': [['py', 'pandas'], ['py'], ['go', 'rust', 'ts']],
})
print(df.explode('tags'))
결과
      user    tags
0    Alice      py
0    Alice  pandas
1      Bob      py
2  Charlie      go
2  Charlie    rust
2  Charlie      ts
usertags
Alicepy
Alicepandas
Bobpy
Charliego
Charlierust
Charliets

같은 index 가 반복됨. reset_index(drop=True) 로 깨끗하게.

여러 컬럼 동시 explode (pandas 1.3+)

df.explode(['tags', 'scores'])
# 두 컬럼이 같은 길이여야 함

빈 list / NaN 처리

df = pd.DataFrame({'x': [[1, 2], [], None]})
df.explode('x')
#    x
# 0  1
# 0  2
# 1  NaN     ← 빈 list 는 NaN 한 행
# 2  NaN     ← None 도 NaN

str.split + explode

문자열을 list 로 분리 후 explode 가 흔한 idiom.

df = pd.DataFrame({'tags_str': ['py,pandas', 'py', 'go,rust,ts']})
df['tags'] = df['tags_str'].str.split(',')
df.explode('tags')

groupby 의 역연산

# group → list
df.groupby('user').agg({'tag': list})
# list → row (explode)
df_grouped.explode('tag')

자주 쓰는 패턴

1. JSON 의 배열 펼치기

import pandas as pd
data = [
    {'order': 1, 'items': ['apple', 'banana']},
    {'order': 2, 'items': ['cherry']},
]
df = pd.DataFrame(data)
df.explode('items')

2. tags 분석

df = pd.DataFrame({
    'post_id': [1, 2, 3],
    'tags': ['python,pandas,data', 'python', 'go,rust'],
})
exploded = df.assign(tag=df['tags'].str.split(',')).explode('tag')
exploded['tag'].value_counts()
# 가장 인기있는 태그

3. range 펼치기

df = pd.DataFrame({
    'start': [1, 5, 10],
    'end': [3, 6, 12],
})
df['range'] = df.apply(lambda r: list(range(r['start'], r['end']+1)), axis=1)
df.explode('range')

함정

1. index 중복

df.explode('tags')             # index 가 0, 0, 1, 2, 2, 2
df.explode('tags').reset_index(drop=True)   # 0, 1, 2, ...

2. dtype 강등

df = pd.DataFrame({'nums': [[1, 2], [3]]})
df.explode('nums').dtypes
# nums: object 가 될 가능성
df['nums'] = pd.to_numeric(df['nums'])    # 다시 int

3. 컬럼이 list 가 아니면 unchange

df = pd.DataFrame({'x': [1, 2, 3]})
df.explode('x')             # 그대로

참고

이 글의 용어 (3개)
[Pandas] groupbypandas
정의 는 데이터를 그룹으로 나누고 (split), 각 그룹에 함수를 적용 (apply), 결과를 합쳐 (combine) 새 DataFrame 으로 만드는 split-apply-c…
[Pandas] meltpandas
정의 는 의 역방향. wide-format → long-format 변환. 여러 컬럼을 두 컬럼 ( , ) 으로 합친다. 장기간 시계열 데이터나 시각화 (ggplot, seabo…
[Pandas] str regex (extract / split / replace)pandas
정의 의 정규식 기반 메서드. 패턴 추출, 분리, 치환 의 핵심. str.extract 캡처 그룹으로 부분 문자열을 새 컬럼으로. <CodeWithOutput language="…

이 개념을 다룬 위키 페이지 (1)

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기