今回は、Pandasを使ってリストを簡単に展開する方法と実践例について紹介します。
はじめに
データ分析を行う際に、Pandasを利用することが多いですよね。しかし、Pandasでは、リストを含むデータを扱うときに、扱いにくくなることがあります。そこで、リストを展開して、扱いやすい形にする方法を紹介します。
リストを持つカラムを展開する基本的な方法
まず、リストを持つカラムを展開する基本的な方法を紹介します。以下のようなデータがあるとします。
import pandas as pd df = pd.DataFrame({'id': [1, 2, 3], 'name': ['Alice', 'Bob', 'Charlie'], 'fruit': [['apple', 'banana'], ['orange', 'lemon'], ['grape', 'peach']]}) print(df)
出力:
id name fruit 0 1 Alice [apple, banana] 1 2 Bob [orange, lemon] 2 3 Charlie [grape, peach]
上記のデータのfruit列には、リストが含まれています。このリストを展開するには、explodeメソッドを使います。
df_explode = df.explode('fruit') print(df_explode)
出力:
id name fruit 0 1 Alice apple 0 1 Alice banana 1 2 Bob orange 1 2 Bob lemon 2 3 Charlie grape 2 3 Charlie peach
explodeメソッドを使うことで、リストの要素がそれぞれ別の行に分割されました。
複数のリストを持つカラムを同時に展開する方法
次に、複数のリストを持つカラムを同時に展開する方法を紹介します。以下のようなデータがあるとします。
df = pd.DataFrame({'id': [1, 2, 3], 'name': ['Alice', 'Bob', 'Charlie'], 'fruit': [['apple', 'banana'], ['orange', 'lemon'], ['grape', 'peach']], 'color': [['red', 'yellow'], ['orange', 'yellow'], ['purple', 'pink']]}) print(df)
出力:
id name fruit color 0 1 Alice [apple, banana] [red, yellow] 1 2 Bob [orange, lemon] [orange, yellow] 2 3 Charlie [grape, peach] [purple, pink]
このようなデータの場合、複数の列を同時に展開するには、applyメソッドを使います。以下のように記述します。
df_explode = df.apply(pd.Series.explode) print(df_explode)
出力:
id name fruit color 0 1 Alice apple red 0 1 Alice banana yellow 1 2 Bob orange orange 1 2 Bob lemon yellow 2 3 Charlie grape purple 2 3 Charlie peach pink
applyメソッドを使うことで、複数の列を同時に展開することができました。
リスト展開後のデータフレームの整形と再構築
リストを展開した後、データフレームを整形することで、より扱いやすくすることができます。以下のようなデータがあるとします。
df = pd.DataFrame({'id': [1, 2, 3], 'name': ['Alice', 'Bob', 'Charlie'], 'fruit': [['apple', 'banana'], ['orange', 'lemon'], ['grape', 'peach']]}) df_explode = df.explode('fruit') print(df_explode)
出力:
id name fruit 0 1 Alice apple 0 1 Alice banana 1 2 Bob orange 1 2 Bob lemon 2 3 Charlie grape 2 3 Charlie peach
リストを展開した後、データフレームを整形するには、pivot_tableメソッドを使います。以下のように記述します。
df_pivot = df_explode.pivot_table(index=['id', 'name'], columns='fruit', aggfunc=len,fill_value=0) print(df_pivot)
出力:
fruit apple banana grape lemon orange peach id name 1 Alice 1 1 0 0 0 0 2 Bob 0 0 0 1 1 0 3 Charlie 0 0 1 0 0 1
上記の例では、pivot_tableメソッドを使って、リスト展開後のデータフレームをidとnameをキーにして、fruitをカラムにして集計しました。集計方法は、len関数を使い、値が存在しない場合はfill_valueを0としています。
また、リスト展開後に集計したデータを再構築することもできます。以下のように記述します。
df_reconstruct = pd.DataFrame(df_pivot.to_records()) print(df_reconstruct)
出力:
id name apple banana grape lemon orange peach 0 1 Alice 1 1 0 0 0 0 1 2 Bob 0 0 0 1 1 0 2 3 Charlie 0 0 1 0 0 1
再構築したデータは、元のデータと同じ形になっています。
実践例:リスト展開を活用したデータ前処理
ここからは、実践的な例として、リスト展開を活用したデータ前処理の例を紹介します。以下のようなデータがあるとします。
df = pd.DataFrame({'id': [1, 2, 3], 'name': ['Alice', 'Bob', 'Charlie'], 'score': [{'math': 80, 'english': 70}, {'math': 90, 'english': 80}, {'math':70, 'english': 90}]}) print(df)
出力:
id name score 0 1 Alice {'math': 80, 'english': 70} 1 2 Bob {'math': 90, 'english': 80} 2 3 Charlie {'math': 70, 'english': 90}
上記のデータのscore列には、辞書型のデータが含まれています。このデータを展開して、扱いやすくするには、以下のように記述します。
df_score = pd.concat([df.drop('score', axis=1), df['score'].apply(pd.Series)], axis=1) print(df_score)
出力:
id name math english 0 1 Alice 80 70 1 2 Bob 90 80 2 3 Charlie 70 90
concat関数を使って、元のデータフレームからscore列を除去し、applyメソッドを使って、score列を展開しました。
まとめ
今回は、Pandasを使ってリストを簡単に展開する方法と実践例について紹介しました。リストを展開することで、より扱いやすい形に変換することができます。データ分析を行う際に、リスト展開を活用して、データの前処理を行うことで、効率的に分析を進めることができます。ぜひ、Pandasでのデータ分析において、リスト展開を活用してみてください。
最後までご覧いただき、ありがとうございました。