pandasでのメモリサイズ削減術!データ解析をもっと快適に

はじめに

データ解析において、大量のデータを扱うことは珍しいことではありません。しかし、大量のデータを扱う場合には、メモリサイズが大きくなり、処理が遅くなってしまうという問題が生じます。そこで、本記事では、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でのメモリサイズ削減についての紹介を終わります。ご清聴ありがとうございました。