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爆速講座

