閉じる

Pandas Seriesを作成する基本手法と応用|データ型指定から効率的な生成まで解説

Pythonを用いたデータ分析において、Pandasは欠かすことのできないライブラリです。

その中でも、データの最小単位であるPandas Series(シリーズ)を正しく理解し、効率的に作成することは、その後の複雑なデータ処理の成否を分ける重要なステップとなります。

2026年の現在、データサイエンスの現場では、よりメモリ効率を意識したデータ型の指定や、欠損値の適切な扱いがこれまで以上に求められています。

本記事では、Pandas Seriesの作成に関する基礎から、実務で役立つ応用手法までを詳しく解説します。

Pandas Seriesの基本構造

PandasのSeriesは、1次元の配列のような構造を持ちながら、各要素にラベル(インデックス)を付与できるのが最大の特徴です。

NumPyのndarrayと似ていますが、インデックスによる直感的な操作や、異なるデータ型への柔軟な対応が可能です。

基本的な構文は以下の通りです。

Python
import pandas as pd
import numpy as np

# 最もシンプルな作成方法
s = pd.Series([10, 20, 30, 40])
print(s)
実行結果
0    10
1    20
2    30
3    40
dtype: int64

出力結果を見るとわかるように、左側に0, 1, 2, 3というインデックスが自動的に割り振られています。

Seriesを作成する際には、主に「データ本体」と「インデックス」の2つの要素を意識する必要があります。

多様なデータソースからのSeries作成

Seriesは、Pythonのリストだけでなく、辞書やNumPy配列、さらにはスカラー値(単一の値)からも作成できます。

それぞれの特徴を理解し、用途に応じて使い分けることが重要です。

リストやレンジオブジェクトからの作成

もっとも一般的な方法は、Pythonのリストを渡すことです。

range()関数を組み合わせて、連続した数値を生成することも頻繁に行われます。

Python
# リストから作成
data_list = [1.5, 2.3, 3.8]
s_list = pd.Series(data_list)

# rangeオブジェクトから作成
s_range = pd.Series(range(5, 10))

print("--- List Series ---")
print(s_list)
print("\n--- Range Series ---")
print(s_range)
実行結果
--- List Series ---
0    1.5
1    2.3
2    3.8
dtype: float64

--- Range Series ---
0    5
1    6
2    7
3    8
4    9
dtype: int64

辞書型からの作成とインデックスの挙動

辞書型をpd.Series()に渡すと、辞書のキーが自動的にインデックスとなり、値がSeriesの要素となります。

データの意味を保持したままSeries化できるため、非常に便利な手法です。

Python
# 辞書から作成
data_dict = {'Tokyo': 1400, 'Osaka': 880, 'Nagoya': 230}
s_dict = pd.Series(data_dict)

print(s_dict)
実行結果
Tokyo     1400
Osaka      880
Nagoya     230
dtype: int64

辞書を使用する場合、特定の順序でインデックスを指定したいときは、引数indexを併用します。

指定したインデックスに該当するキーが辞書にない場合は、欠損値(NaN)として処理されます。

NumPy配列からの作成

大量のデータを扱う場合、NumPy配列からSeriesを作成するのが効率的です。

NumPyの計算能力を活かしつつ、Pandasの柔軟なラベル操作を組み合わせることができます。

Python
# NumPy配列から作成
np_data = np.linspace(0, 1, 5)
s_numpy = pd.Series(np_data)

print(s_numpy)
実行結果
0    0.00
1    0.25
2    0.50
3    0.75
4    1.00
dtype: float64

インデックスのカスタマイズと命名

Seriesの作成時には、デフォルトの連番ではなく、任意のラベルをインデックスとして指定することが可能です。

また、Series自体に名前を付けることで、DataFrameに統合した際の列名として機能させることができます。

インデックスの明示的な指定

引数indexにリストを渡すことで、自由なラベルを設定できます。

Python
data = [100, 200, 300]
labels = ['A', 'B', 'C']

s_custom = pd.Series(data, index=labels)
print(s_custom)
実行結果
A    100
B    200
C    300
dtype: int64

Series名とインデックス名の設定

Seriesにはname属性を持たせることができます。

これは、データセットを管理する上で、そのSeriesが何を表しているのかを識別する重要な情報となります。

Python
s_named = pd.Series(
    [25, 30, 22], 
    index=['User_1', 'User_2', 'User_3'], 
    name='Age'
)
# インデックス自体に名前を付けることも可能
s_named.index.name = 'User_ID'

print(s_named)
実行結果
User_ID
User_1    25
User_2    30
User_3    22
Name: Age, dtype: int64

データ型(dtype)の指定と最適化

Pandas Seriesを作成する際、データ型(dtype)を明示的に指定することは、メモリの節約や計算速度の向上において非常に重要です。

デフォルトではPandasが推論して型を決定しますが、意図しない型(例えば、整数で済むのに浮動小数点数になるなど)が割り当てられることがあります。

主要なデータ型の一覧

Series作成時に指定できる主な型は以下の通りです。

型の名前指定方法(例)特徴
整数型int64, int32整数を保持。ビット数が小さいほどメモリ節約。
浮動小数点型float64, float32小数を含む数値を保持。
オブジェクト型object文字列や混在したデータを保持。
カテゴリ型category繰り返しの多い文字列に有効(極めて高いメモリ効率)。
ブール型bool真偽値(True/False)を保持。
日時型datetime64[ns]日付や時刻の情報を保持。

カテゴリ型による効率化

特定の選択肢(例:都道府県名、性別、ランクなど)しかない文字列データを扱う場合、カテゴリ型(category)を指定することで、劇的にメモリ使用量を削減できます。

Python
# カテゴリ型の指定
colors = ['red', 'blue', 'red', 'green', 'blue'] * 100
s_cat = pd.Series(colors, dtype='category')

print(f"Memory Usage: {s_cat.memory_usage(deep=True)} bytes")
print(s_cat.head())
実行結果
Memory Usage: 424 bytes
0      red
1     blue
2      red
3    green
4     blue
dtype: category
Categories (3, object): ['blue', 'green', 'red']

欠損値(NaN)の扱いとモダンな生成

実データには欠損値が含まれることが多々あります。

Pandasでは伝統的にNumPyのnp.nanが使われてきましたが、最新のPandasでは、より洗練されたpd.NAの使用が推奨されています。

欠損値を含むSeriesの作成

Python
# 欠損値を含むデータの作成
s_missing = pd.Series([1, 2, np.nan, 4])

print(s_missing)
実行結果
0    1.0
1    2.0
2    NaN
3    4.0
dtype: float64

注目すべき点は、整数(1, 2, 4)を含んでいるにもかかわらず、NaNが含まれることでデータ型がfloat64にアップキャストされていることです。

これを防ぐためには、Pandas独自の「Nullable Integer型」を使用します。

Nullable型の活用

dtype='Int64'(大文字のI)のように指定することで、整数型のまま欠損値を保持することが可能です。

Python
# Nullable Integer型の使用
s_nullable = pd.Series([1, 2, None, 4], dtype="Int64")

print(s_nullable)
実行結果
0       1
1       2
2    <NA>
3       4
dtype: Int64

このように、<NA>と表示され、整数精度を維持したまま欠損値を管理できるため、計算ミスや不要なメモリ消費を防げます。

スカラー値による効率的なSeries生成

同じ値で埋められたSeriesを作成する場合、すべての要素をリストで用意する必要はありません。

スカラー値とインデックスを渡すだけで、ブロードキャスト(値の自動拡張)が行われます。

Python
# 全ての要素を 0 で初期化
s_zeros = pd.Series(0, index=['row1', 'row2', 'row3', 'row4'])

print(s_zeros)
実行結果
row1    0
row2    0
row3    0
row4    0
dtype: int64

設定ファイルなどの初期値リストを作成する際や、特定の基準値との比較用Seriesを用意する際に非常に便利な手法です。

作成時の注意点とベストプラクティス

Seriesの作成において、パフォーマンスを最大化するためのポイントをいくつか紹介します。

  1. 可能な限りNumPy配列を経由する
    大規模な数値データをSeriesにする場合、PythonのリストよりもNumPy配列を作成してからPandasに渡す方が高速です。
  2. データ型を明示する
    特に「数値として扱いたいが欠損値がある」場合や「メモリ消費を抑えたい」場合は、dtype引数を省略しないようにしましょう。
  3. コピーかビューかを意識する
    既存の配列からSeriesを作成する際、引数copy=Falseを指定すると、元のデータのコピーを避け、メモリ効率を高めることができる場合があります(ただし、元のデータを変更するとSeriesも変わるため注意が必要です)。

まとめ

Pandas Seriesの作成は、単にデータを配列に入れるだけの作業ではありません。

適切なインデックス設定、メモリ効率を考慮したデータ型の選択、そして欠損値の正しい扱いを組み合わせることで、堅牢かつ高速なデータ処理基盤を構築できます。

本記事で解説した以下のポイントを意識してみてください。

  • リスト、辞書、NumPy配列など、ソースに応じた最適な作成法を選ぶ
  • indexnameを活用して、データの意味を明確にする
  • dtypeを指定し、メモリ最適化と意図しない型変換を防止する
  • 欠損値にはpd.NAやNullable型を検討する

これらをマスターすることで、Pandasを用いたデータ分析の効率は飛躍的に向上します。

Seriesはすべての分析の最小単位であるからこそ、その作成プロセスにこだわる価値があるのです。

クラウドSSLサイトシールは安心の証です。

URLをコピーしました!