PandasとNumPy配列(ndarray)を相互変換する方法【完全ガイド2025】

 

データ分析において、PandasのDataFrame・SeriesとNumPyのndarray配列間の変換は頻繁に必要になります。本記事では、これらのデータ構造の相互変換方法を実践的なサンプルコードと共に詳しく解説します。

PandasとNumPyの基本的な違い

PandasのDataFrame・Seriesは構造化データに適しており、NumPyのndarrayは数値計算に最適化されています。それぞれの特徴を理解して適切に変換することが重要です。

  • Pandas DataFrame: 表形式データ、列名・インデックス付き
  • Pandas Series: 1次元データ、インデックス付き
  • NumPy ndarray: 多次元配列、高速な数値計算

DataFrame → NumPy配列への変換

1. 基本的な変換方法

import pandas as pd
import numpy as np

# サンプルDataFrameの作成
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})

# DataFrameをNumPy配列に変換
arr = df.values
print(arr)  # [[1 4] [2 5] [3 6]]

2. to_numpy()メソッドを使用(推奨)

# より明示的な変換方法
arr = df.to_numpy()
print(type(arr))  # <class 'numpy.ndarray'>

3. 特定の列のみを変換

# 特定の列をNumPy配列に変換
arr_a = df['A'].to_numpy()
print(arr_a)  # [1 2 3]

# 複数列を指定
arr_ab = df[['A', 'B']].to_numpy()
print(arr_ab)

4. データ型を指定した変換

# float型で変換
arr_float = df.to_numpy(dtype=np.float64)
print(arr_float.dtype)  # float64

NumPy配列 → DataFrameへの変換

1. 基本的な変換

# NumPy配列からDataFrameを作成
arr = np.array([[1, 2], [3, 4], [5, 6]])
df = pd.DataFrame(arr)
print(df)

2. 列名を指定した変換

# 列名を指定してDataFrame作成
df = pd.DataFrame(arr, columns=['列1', '列2'])
print(df)

3. インデックスを指定した変換

# インデックスと列名を指定
df = pd.DataFrame(arr, 
                  index=['行1', '行2', '行3'],
                  columns=['A', 'B'])
print(df)

Series → NumPy配列への変換

1. 基本的なSeries変換

# SeriesをNumPy配列に変換
series = pd.Series([10, 20, 30, 40])
arr = series.to_numpy()
print(arr)  # [10 20 30 40]

2. インデックス付きSeriesの変換

# インデックス付きSeries
series = pd.Series([1, 2, 3], index=['a', 'b', 'c'])
arr = series.values  # インデックスは含まれない
print(arr)  # [1 2 3]

NumPy配列 → Seriesへの変換

1. 基本的な配列からSeries作成

# 1次元配列からSeries作成
arr = np.array([100, 200, 300])
series = pd.Series(arr)
print(series)

2. インデックスを指定したSeries作成

# インデックス付きでSeries作成
series = pd.Series(arr, index=['第1四半期', '第2四半期', '第3四半期'])
print(series)

実践的なサンプルコード

サンプル1: 売上データの統計処理

import pandas as pd
import numpy as np

# 売上データの作成
sales_df = pd.DataFrame({
    '1月': [100, 200, 150],
    '2月': [120, 180, 160],
    '3月': [110, 220, 140]
})

# NumPy配列に変換して統計計算
sales_arr = sales_df.to_numpy()
monthly_avg = np.mean(sales_arr, axis=0)

# 結果をSeriesとして作成
avg_series = pd.Series(monthly_avg, index=sales_df.columns)
print("月別平均売上:")
print(avg_series)

サンプル2: 機械学習データの前処理

# 特徴量とラベルの分離
data_df = pd.DataFrame({
    'feature1': [1.1, 2.2, 3.3],
    'feature2': [0.5, 1.5, 2.5],
    'target': [0, 1, 0]
})

# 特徴量をNumPy配列に変換
X = data_df[['feature1', 'feature2']].to_numpy()
y = data_df['target'].to_numpy()

print("特徴量:", X.shape)  # (3, 2)
print("ラベル:", y.shape)   # (3,)

サンプル3: データの正規化処理

# DataFrameで読み込み
df = pd.DataFrame({'値': [10, 20, 30, 40, 50]})

# NumPy配列で正規化処理
arr = df['値'].to_numpy()
normalized = (arr - np.mean(arr)) / np.std(arr)

# 正規化結果をDataFrameに戻す
df['正規化値'] = pd.Series(normalized)
print(df)

データ型の考慮事項

混合データ型の処理

# 文字列と数値が混在するDataFrame
mixed_df = pd.DataFrame({
    '名前': ['太郎', '花子', '次郎'],
    '年齢': [25, 30, 35]
})

# 数値列のみをNumPy配列に変換
age_arr = mixed_df['年齢'].to_numpy()
print(age_arr.dtype)  # int64

データ型の明示的指定

# データ型を明示的に指定
df_typed = pd.DataFrame({
    'int_col': [1, 2, 3],
    'float_col': [1.1, 2.2, 3.3]
})

# 特定のデータ型でNumPy配列に変換
int_arr = df_typed['int_col'].to_numpy(dtype=np.int32)
float_arr = df_typed['float_col'].to_numpy(dtype=np.float32)

パフォーマンスとメモリ効率

copy引数の活用

# メモリ効率を考慮した変換
df = pd.DataFrame({'data': [1, 2, 3, 4, 5]})

# コピーを作成しない(メモリ効率的)
arr_view = df.to_numpy(copy=False)

# 明示的にコピーを作成
arr_copy = df.to_numpy(copy=True)

大容量データの処理

# 大容量データの効率的な処理例
large_data = np.random.randn(10000, 5)
df_large = pd.DataFrame(large_data)

# チャンクごとに処理
chunk_size = 1000
for i in range(0, len(df_large), chunk_size):
    chunk = df_large.iloc[i:i+chunk_size].to_numpy()
    # 処理を実行
    processed = np.mean(chunk, axis=1)

よくあるエラーと対処法

IndexErrorの回避

# 空のDataFrameの処理
empty_df = pd.DataFrame()
if not empty_df.empty:
    arr = empty_df.to_numpy()
else:
    print("DataFrameが空です")

データ型不一致の対処

try:
    mixed_types = pd.DataFrame({'A': [1, 'text', 3]})
    arr = mixed_types.to_numpy()
except Exception as e:
    print(f"変換エラー: {e}")
    # object型として変換
    arr = mixed_types.to_numpy(dtype=object)

まとめ

PandasとNumPyの相互変換は、データ分析において重要なスキルです。主要なポイント:

DataFrame ⇔ NumPy配列

  • .to_numpy()メソッドの使用(推奨)
  • pd.DataFrame()でNumPy配列からDataFrame作成
  • 列名・インデックスの適切な指定

Series ⇔ NumPy配列

  • .to_numpy()または.valuesで配列化
  • pd.Series()で配列からSeries作成
  • インデックス情報の保持・指定

ベストプラクティス

  • データ型の明示的指定
  • メモリ効率を考慮したcopy引数の活用
  • エラーハンドリングの実装

これらの変換方法を適切に使い分けることで、PandasとNumPyの長所を最大限に活用したデータ分析が可能になります。

■プロンプトだけでオリジナルアプリを開発・公開してみた!!

■AI時代の第一歩!「AI駆動開発コース」はじめました!

テックジム東京本校で先行開始。

■テックジム東京本校

「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。

<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。

<月1開催>放送作家による映像ディレクター養成講座

<オンライン無料>ゼロから始めるPython爆速講座