404 Not Found

404 Not Found


nginx

【Series入門】Pandasシリーズの作成・アクセス・基本操作を徹底解説

SeriesはPandasの中で最も基本的なデータ構造です。「ラベル付き一次元配列」とイメージしてください。Seriesはデータ(NumPyのndarray)とラベル(Index)の2つの部分で構成されています。このIndexがあるおかげで、Seriesはただの配列を超えて、各値に「名前」が付けられるのです。このセクションでは、Seriesの正体から始めて、作成方法、演算、よく使うメソッドまでを順に学んでいきましょう。

⚠️ 注意: 以下のコードはローカルのPython環境で実行してください。

1. このセクションで学ぶこと



2. アリスのコーヒーショップ売上日記

(1) 悩み:名前がない数字

アリスはコーヒーショップを経営しています。1週間の売上をNumPyで記録していました:

PYTHON
import numpy as np

sales = np.array([320, 280, 350, 410, 390, 520, 480])
# 520は何曜日?位置5だけど…何曜日だっけ?
print(sales[5])  # 520 — でもこの数字は何を意味するの?
TEXT
ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから試してください。pandasのバージョンによって実際の値が若干異なる場合があります。

520は金曜日でしょうか、それとも土曜日でしょうか?sales[5]だけでは分かりません。「位置→曜日」の対応表を別途管理する必要がありますね。

(2) 解決策:Seriesでデータが自己記述的になる

▶ サンプル:Seriesでラベル付き売上データを作る(難易度 ⭐)

TEXT
ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから試してください。pandasのバージョンによって実際の値が若干異なる場合があります。
PYTHON
import pandas as pd

sales = pd.Series(
    [320, 280, 350, 410, 390, 520, 480],
    index=['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
    name='daily_sales'
)
print(sales)
# Mon    320
# Tue    280
# Wed    350
# Thu    410
# Fri    390
# Sat    520
# Sun    480
# Name: daily_sales, dtype: int64

print(sales['Sat'])  # 520 — ラベルによるアクセス
print(sales.iloc[5])  # 520 — 位置によるアクセス
TEXT
ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから試してください。pandasのバージョンによって実際の値が若干異なる場合があります。

Seriesはデータとラベルを結びつけてくれます。sales['Sat']sales[5]よりもずっと意味が分かりやすいですね。

(3) メリット:Indexはデータの名札

Indexラベルがあると、データは自己記述的になります:



3. Seriesの内部構造

(1) 2つの構成要素:values+index

100%
graph LR
    A[Series] --> B[values: NumPy ndarray]
    A --> C[index: Indexオブジェクト]
    B --> D[320, 280, 350, ...]
    C --> E["Mon, Tue, Wed, ..."]
TEXT
ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから試してください。pandasのバージョンによって実際の値が若干異なる場合があります。
プロパティ 説明
s.values np.ndarray 内部のデータ配列
s.index pd.Index 行ラベル
s.name str Seriesの名前
s.dtype np.dtype 要素のデータ型
s.shape tuple 形状(一次元、例:(7,))
s.size int 要素数

▶ サンプル:Seriesのプロパティを確認する(難易度 ⭐)

TEXT
ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから試してください。pandasのバージョンによって実際の値が若干異なる場合があります。
PYTHON
import pandas as pd
import numpy as np

s = pd.Series([320, 280, 350], index=['Mon', 'Tue', 'Wed'])

print(f"valuesの型: {type(s.values)}")  # <class 'numpy.ndarray'>
print(f"indexの型:  {type(s.index)}")   # <class 'pandas.core.indexes.base.Index'>
print(f"dtype: {s.dtype}")   # int64
print(f"shape: {s.shape}")   # (3,)
print(f"size:  {s.size}")    # 3
print(f"name:  {s.name}")    # None
TEXT
ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから試してください。pandasのバージョンによって実際の値が若干異なる場合があります。

(2) Seriesとndarrayの比較

特徴 NumPy ndarray Pandas Series
ラベル なし(位置のみ) あり(Index)
混合型 非対応 非推奨だが可能(object)
欠損値 np.nan(floatのみ) NaN / pd.NA(全型対応)
演算の整列 位置基準 ラベル基準
名前 なし nameプロパティ
よく使う統計 np.meanなど .mean()のようなメソッドチェーン
内部実装 ndarray ndarray+Index
📌 ポイント: Seriesの本質は「ndarray+Index+name」です。.valuesだけを使う場合、ただのndarrayに退化してしまいます。



4. Seriesのさまざまな作成方法

(1) リストから作成する

▶ サンプル:リストからSeriesを作成する(難易度 ⭐)

TEXT
ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから試してください。pandasのバージョンによって実際の値が若干異なる場合があります。
PYTHON
import pandas as pd

# デフォルトのインデックス:0, 1, 2, ...
s1 = pd.Series([10, 20, 30, 40])
print(s1)
# 0    10
# 1    20
# 2    30
# 3    40

# カスタムインデックス
s2 = pd.Series([10, 20, 30, 40], index=['a', 'b', 'c', 'd'])
print(s2['b'])  # 20

# 名前付き
s3 = pd.Series([10, 20, 30], name='scores')
print(s3.name)  # scores
TEXT
ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから試してください。pandasのバージョンによって実際の値が若干異なる場合があります。

(2) 辞書から作成する

▶ サンプル:辞書からSeriesを作成する(難易度 ⭐)

TEXT
ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから試してください。pandasのバージョンによって実際の値が若干異なる場合があります。
PYTHON
import pandas as pd

# キーがインデックスに、値がデータになる
population = pd.Series({
    'Tokyo': 13960000,
    'New York': 8336000,
    'London': 8982000,
    'Paris': 2161000
})
print(population)
# Tokyo      13960000
# New York    8336000
# London      8982000
# Paris       2161000

print(population['London'])  # 8982000
TEXT
ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから試してください。pandasのバージョンによって実際の値が若干異なる場合があります。

辞書から作成するメリットは、キーが自動的にIndexになることです。手動で指定する必要がありません。

(3) NumPyのndarrayから作成する

▶ サンプル:ndarrayからSeriesを作成する(難易度 ⭐)

TEXT
ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから試してください。pandasのバージョンによって実際の値が若干異なる場合があります。
PYTHON
import numpy as np
import pandas as pd

arr = np.array([3.14, 2.72, 1.41, 1.73])
s = pd.Series(arr, index=['pi', 'e', 'sqrt2', 'sqrt3'])
print(s)
# pi      3.14
# e       2.72
# sqrt2   1.41
# sqrt3   1.73
print(f"内部の型: {type(s.values)}")  # numpy.ndarray
TEXT
ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから試してください。pandasのバージョンによって実際の値が若干異なる場合があります。

(4) スカラーから作成する(ブロードキャスト)

▶ サンプル:スカラーのブロードキャストでSeriesを作成する(難易度 ⭐)

TEXT
ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから試してください。pandasのバージョンによって実際の値が若干異なる場合があります。
PYTHON
import pandas as pd

# スカラーをブロードキャストして全インデックスを埋める
s = pd.Series(0, index=['A', 'B', 'C', 'D'])
print(s)
# A    0
# B    0
# C    0
# D    0
TEXT
ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから試してください。pandasのバージョンによって実際の値が若干異なる場合があります。

(5) 作成方法の比較

方法 構文 インデックスの来源 ユースケース
リスト pd.Series([1,2,3]) デフォルトのRangeIndex 簡単なテスト
リスト+index pd.Series([1,2,3], index=...) 手動で指定 カスタムラベルが必要なとき
辞書 pd.Series({'a':1, 'b':2}) 辞書のキー ラベルと値のペア
ndarray pd.Series(np.array(...)) デフォルトまたは指定 NumPyデータの変換
スカラー pd.Series(0, index=...) 手動で指定 初期化・埋め込み


5. Seriesへのアクセス

(1) ラベルアクセスと位置アクセス

▶ サンプル:2つのアクセス方法(難易度 ⭐⭐)

TEXT
ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから試してください。pandasのバージョンによって実際の値が若干異なる場合があります。
PYTHON
import pandas as pd

s = pd.Series([320, 280, 350, 410],
              index=['Mon', 'Tue', 'Wed', 'Thu'])

# ラベルによるアクセス(推奨)
print(s['Tue'])       # 280
print(s.loc['Tue'])   # 280 — 明示的なラベルアクセス

# 位置によるアクセス
print(s.iloc[1])      # 280 — 明示的な位置アクセス

# ラベルによるスライス(終点を含む)
print(s['Mon':'Wed'])
# Mon    320
# Tue    280
# Wed    350

# 位置によるスライス(終点を含まない、Pythonと同じ)
print(s.iloc[0:3])
# Mon    320
# Tue    280
# Wed    350
TEXT
ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから試してください。pandasのバージョンによって実際の値が若干異なる場合があります。
🔥 よくある落とし穴: ラベルスライスは終点を含みます('Mon':'Wed'はWedを含む)。一方、位置スライスは終点を含みません(iloc[0:3]は位置3を含まない)。これはPandas初心者が最も混乱しやすいポイントです。

(2) アクセス方法の比較

方法 構文 終点 推奨用途
s[label] 省略形 単一のラベル
s.loc[label] 明示的なラベル 終点を含む 意図を明確にしたいとき
s.iloc[pos] 明示的な位置 終点を含まない 位置で指定したいとき
s[[l1,l2]] リスト選択 複数のラベル


6. Seriesの演算

(1) ベクトル化演算

▶ サンプル:Seriesのベクトル化演算(難易度 ⭐)

TEXT
ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから試してください。pandasのバージョンによって実際の値が若干異なる場合があります。
PYTHON
import pandas as pd

sales = pd.Series([320, 280, 350, 410],
                  index=['Mon', 'Tue', 'Wed', 'Thu'])

# 算術演算
print(sales * 1.1)      # 10%値上げ
# Mon    352.0
# Tue    308.0
# Wed    385.0
# Thu    451.0

# 比較演算
print(sales > 300)
# Mon     True
# Tue    False
# Wed     True
# Thu     True

# ブール値でフィルタリング
print(sales[sales > 300])
# Mon    320
# Wed    350
# Thu    410
TEXT
ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから試してください。pandasのバージョンによって実際の値が若干異なる場合があります。

(2) インデックス整列演算

これはSeriesの最も重要な特徴の1つです:演算は位置ではなくIndexで整列されます

▶ サンプル:インデックス整列演算(難易度 ⭐⭐)

TEXT
ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから試してください。pandasのバージョンによって実際の値が若干異なる場合があります。
PYTHON
import pandas as pd

week1 = pd.Series({'Mon': 320, 'Tue': 280, 'Wed': 350})
week2 = pd.Series({'Tue': 310, 'Wed': 370, 'Thu': 400})

# インデックスで自動整列、一致しないもの→NaN
total = week1 + week2
print(total)
# Mon      NaN   # week1にのみ存在
# Tue    590.0   # 280 + 310
# Wed    720.0   # 350 + 370
# Thu      NaN   # week2にのみ存在

# NaNの代わりに0で埋める
total_filled = week1.add(week2, fill_value=0)
print(total_filled)
# Mon    320.0
# Tue    590.0
# Wed    720.0
# Thu    400.0
TEXT
ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから試してください。pandasのバージョンによって実際の値が若干異なる場合があります。
💡 ヒント: 2つのSeriesのIndexが完全に一致しない場合、Pandasは自動的に整列します。一致するラベルは計算され、一致しないものはNaNで埋められます。これにより、微妙な「位置のずれ」バグを防げます。.add(fill_value=0)のようなメソッドは+演算子の代わりに使い、欠損値の埋め方(フィル戦略)を指定できます。



7. Seriesのよく使うメソッド

(1) 統計と概要

メソッド 説明 NumPyの同等機能
s.mean() 平均 np.mean(arr)
s.median() 中央値 np.median(arr)
s.std() 標準偏差 np.std(arr)
s.min() / s.max() 最小値 / 最大値 np.min() / np.max()
s.sum() 合計 np.sum(arr)
s.describe() 統計サマリー なし
s.value_counts() 頻度集計 なし
s.unique() 一意な値 np.unique(arr)

▶ サンプル:統計メソッド(難易度 ⭐)

TEXT
ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから試してください。pandasのバージョンによって実際の値が若干異なる場合があります。
PYTHON
import pandas as pd

scores = pd.Series([85, 92, 78, 95, 88, 92, 78, 85, 90, 92],
                   name='exam_score')

print(scores.describe())
# count    10.000000
# mean     87.500000
# std       5.976143
# min      78.000000
# 25%      85.000000
# 50%      89.000000
# 75%      92.000000
# max      95.000000

print(scores.value_counts())
# 92    3
# 85    2
# 78    2
# 95    1
# 90    1
# 88    1
TEXT
ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから試してください。pandasのバージョンによって実際の値が若干異なる場合があります。

(2) 確認とフィルタリング

▶ サンプル:head / tail / isin(難易度 ⭐)

TEXT
ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから試してください。pandasのバージョンによって実際の値が若干異なる場合があります。
PYTHON
import pandas as pd

s = pd.Series(range(1, 101))  # 1から100まで

print(s.head())    # 先頭5件
print(s.tail(3))   # 末尾3件

# isin:メンバーシップ判定
fruits = pd.Series(['apple', 'banana', 'cherry', 'apple', 'date'])
print(fruits.isin(['apple', 'cherry']))
# 0     True
# 1    False
# 2     True
# 3     True
# 4    False
TEXT
ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから試してください。pandasのバージョンによって実際の値が若干異なる場合があります。

(3) NaNの処理

▶ サンプル:NaN処理メソッド(難易度 ⭐)

TEXT
ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから試してください。pandasのバージョンによって実際の値が若干異なる場合があります。
PYTHON
import pandas as pd
import numpy as np

s = pd.Series([10, np.nan, 30, np.nan, 50])

print(s.isna())     # NaNを検出
# 0    False
# 1     True
# 2    False
# 3     True
# 4    False

print(s.notna())    # 非NaNを検出
print(s.dropna())   # NaNを削除: [10.0, 30.0, 50.0]
print(s.fillna(0))  # NaNを0で埋める
print(s.fillna(s.mean()))  # 平均値で埋める
TEXT
ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから試してください。pandasのバージョンによって実際の値が若干異なる場合があります。


8. 総合例:コーヒーショップの週間売上分析

▶ サンプル:コーヒーショップ売上分析の完全な例(難易度 ⭐⭐⭐)

TEXT
ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから試してください。pandasのバージョンによって実際の値が若干異なる場合があります。
PYTHON
import pandas as pd
import numpy as np

# ============================================
# 総合例:Seriesを使ったコーヒーショップの
# 週間売上分析
# ============================================

# 1. 曜日ラベル付きの売上データを作成
sales = pd.Series({
    'Mon': 320, 'Tue': 280, 'Wed': 350,
    'Thu': 410, 'Fri': 390, 'Sat': 520, 'Sun': 480
}, name='daily_sales_USD')

# 2. 基本統計
print("=== 週間売上レポート ===")
print(f"合計:      ${sales.sum():,}")
print(f"日平均:    ${sales.mean():.0f}")
print(f"最高曜日:  {sales.idxmax()} (${sales.max():,})")
print(f"最低曜日:  {sales.idxmin()} (${sales.min():,})")
print(f"標準偏差:  ${sales.std():.0f}")

# 3. 週末と平日の分析
weekday_avg = sales[['Mon','Tue','Wed','Thu','Fri']].mean()
weekend_avg = sales[['Sat','Sun']].mean()
print(f"\n平日平均: ${weekday_avg:.0f}")
print(f"週末平均: ${weekend_avg:.0f}")
print(f"週末の上乗せ: {(weekend_avg/weekday_avg - 1)*100:.1f}%")

# 4. 日次変動
change = sales.pct_change() * 100
print(f"\n最大の前日比下落: {change.min():.1f}%({change.idxmin()})")
print(f"最大の前日比上昇: {change.max():.1f}%({change.idxmax()})")

# 5. 累積売上
cum_sales = sales.cumsum()
print(f"\n売上目標$2,000達成日: {cum_sales[cum_sales >= 2000].index[0]}")

# 6. ランキング
print(f"\n売上ランキング:\n{sales.rank(ascending=False).astype(int)}")
TEXT
ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから試してください。pandasのバージョンによって実際の値が若干異なる場合があります。

期待される出力(抜粋):

TEXT
=== 週間売上レポート ===
合計:      $2,750
日平均:    $393
最高曜日:  Sat ($520)
最低曜日:  Tue ($280)
標準偏差:  $82

平日平均: $350
週末平均: $500
週末の上乗せ: 42.9%

最大の前日比下落: -12.5%(Tue)
最大の前日比上昇: 33.3%(Sat)

❓ よくある質問

Q Seriesとndarrayの違いは何ですか?
A Series=ndarray+Index+nameです。Seriesの内部のvaluesはndarrayですが、ラベルインデックスと名前が追加されています。演算時にSeriesはIndexで整列し、ndarrayは位置で整列します。ラベルが不要な場合は.valuesでndarrayを取り出せばOKです。
Q Indexに重複があってもいいですか?
A はい、Pandasは重複するIndex値を許可します。ただしパフォーマンスが低下し、重複ラベルにアクセスすると複数の値(スカラーではなくSeries)が返されます。可能な限りIndexは一意に保つのがベストです。s.index.is_uniqueで確認できます。
Q 演算時にNaNはどう処理されますか?
A デフォルトではNaNは伝播します。NaNを含む演算の結果はNaNになります。s.mean(skipna=True)のようなメソッドは自動的にNaNをスキップします(これがデフォルトの動作です)。s.dropna()で欠損値を削除し、s.fillna()で埋めることができます。
Q value_countsとuniqueの違いは何ですか?
A unique()は重複を除いた配列を返します(カウントなし)。一方、value_counts()は各値の出現回数を返します(降順でソート)。頻度を知りたいときはvalue_counts、一意なリストだけが欲しいときはuniqueを使ってください。
Q Seriesに異なる型を混在させられますか?
A 技術的には可能です(dtype=object)が、推奨されません。混合型のSeriesはベクトル化演算の恩恵を失い、パフォーマンスが大きく低下します。混合型が必要な場合はDataFrameを使ってください。各列が独自の型を持てます。
Q locとiloc、どちらを使うべきですか?
A ラベルによるアクセスにはloc、位置によるアクセスにはilocを使ってください。loc/ilocで意図を明示的に宣言し、s[...]の曖昧さ(ラベルにも位置にもなり得る)を避けるのがベストです。
Q s[label]とs.loc[label]の違いは何ですか?
A Seriesに対しては同じ効果です。ただしs[...]は曖昧です。ラベルにも位置にもなり得ます(Indexが整数ベースの場合)。s.loc[label]は明示的にラベル指定、s.iloc[pos]は明示的に位置指定を意味するので、明示的な形式が推奨されます。

📖 まとめ


📝 練習問題

  1. 基礎(難易度 ⭐):3つの方法(リスト+index / 辞書 / ndarray)でSeriesを作成し、それぞれのindexプロパティとvaluesプロパティを出力してください。
  2. 応用(難易度 ⭐⭐):Indexの値が完全には一致しない2つのSeries(例:月次売上)を作成し、add(fill_value=0)で加算して、+演算子を直接使った場合の結果と比較してください。
  3. チャレンジ(難易度 ⭐⭐⭐):Seriesを使ってある商品の月次売上データ(12ヶ月分)をシミュレーションし、次の処理を行ってください:累積売上の計算→累計が50,000を突破した月の特定→前月比成長率の算出→成長率が最も高い月と最も低い月の特定。

← 前へ:Pandas入門 · 次へ:DataFrameの基礎 →

Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%