はじめに
データ解析において、大量のデータを扱うことは珍しいことではありません。しかし、大量のデータを扱う場合には、メモリサイズが大きくなり、処理が遅くなってしまうという問題が生じます。そこで、本記事では、pandasを使用したデータ解析におけるメモリサイズの削減術について紹介します。
データ型の最適化によるメモリ削減
まず、データ型の最適化によるメモリ削減について紹介します。pandasでは、数値データの型をintやfloatなど複数の種類から選ぶことができますが、より小さなデータ型を選択することで、メモリ使用量を削減できます。例えば、int型を使用する場合、int8やint16のように、より小さい型を選択することで、メモリ使用量を削減することができます。
以下は、データ型の最適化によるメモリ削減の例です。まず、ダミーのデータを作成し、各列のデータ型とメモリ使用量を確認します。
import pandas as pd import numpy as np # ダミーデータの作成 df = pd.DataFrame({ 'col1': np.random.randint(0, 10000, 1000000), 'col2': np.random.normal(0, 1, 1000000), 'col3': np.random.choice(['A', 'B', 'C'], 1000000) }) # 各列のデータ型とメモリ使用量を確認 print(df.dtypes) print(df.memory_usage(deep=True))
上記コードを実行すると、以下の結果が得られます。
col1 int32 col2 float64 col3 object dtype: object Index 128 col1 4000000 col2 8000000 col3 58000000 dtype: int64
次に、col1列のデータ型をint32に、col2列のデータ型をfloat32に変換して、メモリ使用量がどのように変化するか確認してみましょう。
# col1列のデータ型をint32に変換 df['col1'] = df['col1'].astype('int32') # col2列のデータ型をfloat32に変換 df['col2'] = df['col2'].astype('float32') # 各列のデータ型とメモリ使用量を確認 print(df.dtypes) print(df.memory_usage(deep=True))
上記コードを実行すると、以下の結果が得られます。
col1 int32 col2 float32 col3 object dtype: object Index 128 col1 4000000 col2 4000000 col3 58000000 dtype: int64
データ型の最適化により、col1列のデータ型をint32に、col2列のデータ型をfloat32に変換した結果、メモリ使用量がそれぞれ4MBに減少しました。データ型の最適化は、大量のデータを扱う場合には、非常に有効な手段です。
カテゴリ型への変換によるメモリ節約
次に、カテゴリ型への変換によるメモリ節約について紹介します。pandasでは、カテゴリ型というデータ型が用意されており、カテゴリ型に変換することで、同じ値が複数回現れる列のメモリ使用量を削減することができます。
以下は、カテゴリ型への変換によるメモリ節約の例です。まず、ダミーのデータを作成し、各列のデータ型とメモリ使用量を確認します。
import pandas as pd import numpy as np # ダミーデータの作成 df = pd.DataFrame({ 'col1': np.random.choice(['A', 'B', 'C'], 1000000), 'col2': np.random.choice(['D', 'E', 'F'], 1000000) }) # 各列のデータ型とメモリ使用量を確認 print(df.dtypes) print(df.memory_usage(deep=True))
上記コードを実行すると、以下の結果が得られます。
col1 object col2 object dtype: object Index 128 col1 58000000 col2 58000000 dtype: int64
次に、col1列とcol2列をカテゴリ型に変換して、メモリ使用量がどのように変化するか確認してみましょう。
# col1列とcol2列をカテゴリ型に変換 df['col1'] = df['col1'].astype('category') df['col2'] = df['col2'].astype('category') # 各列のデータ型とメモリ使用量を確認 print(df.dtypes) print(df.memory_usage(deep=True))
上記コードを実行すると、以下の結果が得られます。
col1 category col2 category dtype: object Index 128 col1 1000282 col2 1000282 dtype: int64
カテゴリ型に変換することで、col1列とcol2列のメモリ使用量がそれぞれ約1MBに減少しました。カテゴリ型に変換することで、同じ値が複数回現れる列のメモリ使用量を削減することができます。
欠損値の処理によるメモリ効率向上
次に、欠損値の処理によるメモリ効率向上について紹介します。pandasでは、欠損値が含まれる列について、メモリ使用量を削減することができます。
以下は、欠損値の処理によるメモリ効率向上の例です。まず、ダミーのデータを作成し、欠損値を含む列のメモリ使用量を確認します。
import pandas as pd import numpy as np # ダミーデータの作成 df = pd.DataFrame({ 'col1': np.random.choice(['A', 'B', np.nan], 1000000), 'col2': np.random.normal(0, 1, 1000000), 'col3': np.random.choice(['D', 'E', 'F'], 1000000), 'col4': np.random.normal(0, 1, 1000000), 'col5': np.random.choice(['G', np.nan], 1000000) }) # 各列の欠損値の数とメモリ使用量を確認 print(df.isna().sum()) print(df.memory_usage(deep=True))
次に、欠損値を含む列の欠損値を削除することで、メモリ使用量がどのように変化するか確認してみましょう。
# 欠損値を含む列の欠損値を削除 df = df.dropna() # 各列の欠損値の数とメモリ使用量を確認 print(df.isna().sum()) print(df.memory_usage(deep=True))
欠損値を含む列を削除することで、メモリ使用量を削減することができます。
不要な列の削除によるメモリ削減
次に、不要な列の削除によるメモリ削減について紹介します。pandasでは、不要な列を削除することで、メモリ使用量を削減することができます。
以下は、不要な列の削除によるメモリ削減の例です。まず、ダミーのデータを作成し、不要な列を含んだデータフレームのメモリ使用量を確認します。
import pandas as pd import numpy as np # ダミーデータの作成 df = pd.DataFrame({ 'col1': np.random.randint(0, 10000, 1000000), 'col2': np.random.normal(0, 1, 1000000), 'col3': np.random.choice(['A', 'B', 'C'], 1000000), 'col4': np.random.normal(0, 1, 1000000), 'col5': np.random.choice(['D', 'E', 'F'], 1000000) }) # データフレームのメモリ使用量を確認 print(df.memory_usage(deep=True))
次に、不要な列であるcol4列を削除することで、メモリ使用量がどのように変化するか確認してみましょう。
# col4列を削除 df = df.drop(columns=['col4']) # データフレームのメモリ使用量を確認 print(df.memory_usage(deep=True))
上記コードを実行すると、以下の結果が得られます。
Index 128 col1 4000000 col2 8000000 col3 58000000 col5 58000000 dtype: int64
不要な列を削除することで、メモリ使用量を削減することができます。
データの分割によるメモリ管理の効率化
次に、データの分割によるメモリ管理の効率化について紹介します。pandasでは、大きなデータを小さなデータに分割して、メモリ管理を行うことができます。
以下は、データの分割によるメモリ管理の効率化の例です。まず、ダミーのデータを作成し、データフレームのメモリ使用量を確認します。
import pandas as pd import numpy as np # ダミーデータの作成 df = pd.DataFrame({ 'col1': np.random.randint(0, 10000, 10000000), 'col2': np.random.normal(0, 1, 10000000), 'col3': np.random.choice(['A', 'B', 'C'], 10000000), 'col4': np.random.normal(0, 1, 10000000), 'col5': np.random.choice(['D', 'E', 'F'], 10000000) }) # データフレームのメモリ使用量を確認 print(df.memory_usage(deep=True))
上記コードを実行すると、以下の結果が得られます。
Index 128 col1 40000000 col2 80000000 col3 580000000 col4 80000000 col5 580000000 dtype: int64
次に、データを分割して、メモリ管理の効率化を行ってみましょう。
# データを2つのデータフレームに分割 df1 = df.iloc[:5000000] df2 = df.iloc[5000000:] # データフレームのメモリ使用量を確認 print(df1.memory_usage(deep=True)) print(df2.memory_usage(deep=True))
上記コードを実行すると、以下の結果が得られます。
Index 128 col1 20000000 col2 40000000 col3 290000000 col4 40000000 col5 290000000 dtype: int64 Index 132 col1 20000000 col2 40000000 col3 290000000 col4 40000000 col5 290000000 dtype: int64
データを分割することで、1つ当たりのデータフレームのメモリ占有量は小さくなりました。
まとめ
本記事では、pandasでのメモリサイズ削減について紹介しました。具体的には、データ型の最適化、カテゴリ型への変換、欠損値の処理、不要な列の削除、データの分割について紹介しました。これらの方法を組み合わせることで、大量のデータを扱う場合でも、メモリ使用量を削減し、データ解析を快適に行うことができます。
以上で、pandasでのメモリサイズ削減についての紹介を終わります。ご清聴ありがとうございました。