DataFrame の列にリストが格納されていることがあります。たとえばタグや複数カテゴリなど、1 つのセルに複数の値が入っているケースです。pandas の explode メソッドを使えば、リストの各要素を個別の行に展開できます。
基本的な使い方
explode は指定した列のリストを行方向に展開します。
import pandas as pd
df = pd.DataFrame({
"name": ["Alice", "Bob", "Charlie"],
"tags": [["Python", "pandas"], ["JavaScript"], ["Python", "NumPy", "matplotlib"]]
})
print(df.explode("tags"))
Alice の行は 2 行に、Charlie の行は 3 行に展開されます。他の列(name)は展開に合わせて複製されるため、データの対応関係が崩れることはありません。
インデックスの扱い
展開後のインデックスは元の行のインデックスがそのまま保持されます。
result = df.explode("tags")
print(result.index.tolist())
Alice の 2 行はどちらもインデックス 0 を持ちます。重複インデックスが不要であれば reset_index(drop=True) で振り直しましょう。
result = df.explode("tags").reset_index(drop=True)
空リストや NaN の処理
リストが空の場合、explode はその行を NaN として残します。
df2 = pd.DataFrame({
"name": ["Alice", "Bob"],
"tags": [["Python"], []]
})
print(df2.explode("tags"))
Bob の行は tags が NaN になります。空リストを事前に除外しておくか、展開後に dropna で処理するかは用途に応じて判断してください。
文字列のリストを展開する
列に格納されているのがリストではなくカンマ区切りの文字列であれば、先に str.split でリストに変換してから explode を適用します。
df3 = pd.DataFrame({
"name": ["Alice", "Bob"],
"tags": ["Python,pandas", "JavaScript,React"]
})
result = df3.assign(tags=df3["tags"].str.split(",")).explode("tags")
print(result)
カンマ区切りの文字列
str.split でリストに変換
explode で行に展開
集計との組み合わせ
explode のよくある活用パターンは、展開後に groupby で集計する方法です。
df_exploded = df.explode("tags")
tag_counts = df_exploded["tags"].value_counts()
print(tag_counts)
タグごとの出現回数や、カテゴリごとの平均値を求めるといった分析が、explode と groupby の組み合わせで簡潔に書けます。
explode はリスト型のデータを正規化するための便利なメソッドです。逆に行をリストにまとめたい場合は groupby と agg で list を指定する方法がありますが、まずは explode で展開してから分析するパターンを覚えておくとよいでしょう。