【Python】Pandasでリストを簡単に展開する方法と実践例

今回は、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でのデータ分析において、リスト展開を活用してみてください。

最後までご覧いただき、ありがとうございました。