0Pricing
Pandas & NumPy Academy · レッスン

インデックスの設定とリセット

set_index()で列を行インデックスに設定し、reset_index()で元に戻して、MultiIndexの概要を理解します。

「インデックスの設定とリセット」はCoddyKit上の無料Pandas & NumPy Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPandas & NumPy Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Pandas & NumPy Academyコースには全4レッスンが含まれています。

DataFrameのインデックスとは

すべてのPandas DataFrameには行インデックスがあります。これは各行に付けられたラベルの集合です。デフォルトのインデックスはRangeIndex(0、1、2、…)ですが、日付、商品ID、ユーザーID、一意のキーなど、自然な識別子として機能する任意の列に置き換えられます。意味のあるインデックスを使うと可読性が向上し、ラベルベースのスライスが可能になります。また、時系列のリサンプリングにも必要です。

import pandas as pd

df = pd.DataFrame({
    'date': ['2024-01-01', '2024-01-02', '2024-01-03'],
    'sales': [100, 200, 150]
})
print('Default index:', df.index.tolist())  # [0, 1, 2]
print(df)

set_index() — 列をインデックスにする

DataFrame.set_index('col')は、指定した列を行インデックスにし、通常の列から削除します。その列の値が行ラベルになります。これは、ある列が自然なキーとして機能する場合に、DataFrameをより表現力豊かにする標準的な方法です。新しいDataFrameが返され、inplace=Trueを使わない限り元のDataFrameは変更されません。

import pandas as pd

df = pd.DataFrame({
    'date': ['2024-01-01', '2024-01-02', '2024-01-03'],
    'sales': [100, 200, 150]
})

df = df.set_index('date')
print(df)
#             sales
# date
# 2024-01-01    100
# 2024-01-02    200
# 2024-01-03    150

print(df.index)  # Index(['2024-01-01', ...], dtype='object', name='date')

カスタムインデックスで行を選択する

意味のある列をインデックスにすると、.loc[label]を使って、ブールマスクなしの読みやすい構文でラベルにより行を取得できます。DatetimeIndexでは、df.loc['2024-01']のように部分的な日付文字列を使って、2024年1月のすべての行を選択することもできます。

import pandas as pd

df = pd.DataFrame({
    'product': ['A', 'B', 'C'],
    'price': [10, 20, 30],
    'stock': [100, 50, 75]
})
df = df.set_index('product')

# Access row by label
print(df.loc['B'])
# price    20
# stock    50
# Name: B, dtype: int64

複数列を使った set_index() — MultiIndex

set_index()に列名のリストを渡すと、MultiIndex(階層型インデックス)が作成されます。作成されたDataFrameには、.loc[]でタプルを使ってアクセスできます。MultiIndexは、グループ化された時系列(地域+日付)、パネルデータ(対象+時間)、2階層の行グループが必要な分析に不可欠です。

import pandas as pd

df = pd.DataFrame({
    'region': ['East', 'East', 'West', 'West'],
    'year': [2023, 2024, 2023, 2024],
    'revenue': [100, 150, 200, 220]
})

df = df.set_index(['region', 'year'])
print(df)
#              revenue
# region year
# East   2023      100
#        2024      150
# West   2023      200
#        2024      220

print(df.loc[('East', 2024)])  # revenue = 150

set_index() の drop= パラメーター

デフォルトでは、set_index('col')は列をインデックスにすると、その列をDataFrameの通常の列から削除します。drop=Falseを渡すと、インデックスとして使いながら列をそのまま残すことができます。ラベルによるアクセスを使いつつ、通常の列領域での計算にもその列を利用したい場合に便利です。

import pandas as pd

df = pd.DataFrame({'id': [1, 2, 3], 'value': [10, 20, 30]})

# Keep 'id' as both index and column
df_with_both = df.set_index('id', drop=False)
print(df_with_both)
#     id  value
# id
# 1    1     10
# 2    2     20
# 3    3     30

reset_index() — インデックスを列に戻す

reset_index()はset_index()の逆で、現在の行インデックスを通常の列に戻し、インデックスをデフォルトのRangeIndexに置き換えます。groupby().agg()の後や、意味のあるインデックスを後続の処理で列として使いたい場合によく使用します。

import pandas as pd

df = pd.DataFrame({'sales': [100, 200]}, index=['East', 'West'])
df.index.name = 'region'

reset = df.reset_index()
print(reset)
#   region  sales
# 0   East    100
# 1   West    200

print(reset.index.tolist())  # [0, 1] — default RangeIndex restored

reset_index(drop=True)

reset_index()にdrop=Trueを渡すと、現在のインデックスを列に移さず、完全に破棄します。現在のインデックスに意味がない場合(行のフィルタリング後に、インデックスが0、3、7のように欠けている場合など)に使うと、0から始まるきれいな連続インデックスにできます。

import pandas as pd

df = pd.DataFrame({'x': [10, 20, 30, 40, 50]})
filtered = df[df['x'] > 15]
print('Filtered index:', filtered.index.tolist())  # [1, 2, 3, 4]

# Drop the old index — don't move it to a column
clean = filtered.reset_index(drop=True)
print('Clean index:', clean.index.tolist())  # [0, 1, 2, 3]

groupby 後の reset_index()

groupby().agg()を呼び出すと、グループ化のキーがインデックスになります。reset_index()を呼び出すと、それらが通常の列に戻り、扱いやすく、結合やエクスポートもしやすい平坦な表形式の結果になります。これは、実務でのreset_index()の最も一般的な用途の1つです。

import pandas as pd

df = pd.DataFrame({
    'dept': ['Eng', 'HR', 'Eng', 'Sales', 'HR'],
    'salary': [90000, 50000, 80000, 70000, 55000]
})

# After groupby, dept becomes the index
agg = df.groupby('dept')['salary'].mean()
print(type(agg), agg.index.tolist())
# dept is the index

# Reset makes dept a regular column again
result = agg.reset_index()
result.columns = ['dept', 'avg_salary']
print(result)

インデックス名のための rename_axis()

行インデックスに名前がない場合や、分かりやすい名前に変更したい場合は、df.rename_axis('new_name')(行インデックスの場合)またはdf.rename_axis('col_name', axis=1)(列軸の場合)を使います。インデックスに意味のある名前を付けると、出力がより自己説明的になります。特にCSVへエクスポートする場合、インデックス名が列見出しになるため便利です。

import pandas as pd

df = pd.DataFrame({'sales': [100, 200, 300]}, index=['A', 'B', 'C'])
print(df.index.name)  # None

# Name the index
df = df.rename_axis('region')
print(df)
#         sales
# region
# A         100
# B         200
# C         300

欠損部分を埋めるための再インデックス

DataFrame.reindex(new_index)は、DataFrameを新しいインデックスに合わせて形状変更します。新しいインデックスには存在するものの元のデータには存在しない位置には、NaNが入ります。これは、DataFrameを共通の完全なインデックスに揃えるために使います。たとえば、一部の月にデータがなくても、1年のすべての月が現れるようにできます。

import pandas as pd

df = pd.DataFrame({
    'month': ['Jan', 'Mar', 'Jun'],
    'revenue': [100, 200, 300]
}).set_index('month')

all_months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun']
complete = df.reindex(all_months)
print(complete)
#       revenue
# Jan     100.0
# Feb       NaN   <- filled with NaN
# Mar     200.0
# Apr       NaN
# May       NaN
# Jun     300.0

MultiIndex の reset_index とレベル選択

MultiIndexのDataFrameでは、reset_index()を使うと、デフォルトですべてのレベルが列に戻ります。level=を渡すと、特定のレベルだけをリセットできます。1つのレベルをインデックスとして残し(たとえば日付をインデックスに残す)、もう一方のレベルだけを列に移したい場合に便利です。

import pandas as pd

df = pd.DataFrame(
    {'revenue': [100, 150, 200, 220]},
    index=pd.MultiIndex.from_tuples(
        [('East', 2023), ('East', 2024), ('West', 2023), ('West', 2024)],
        names=['region', 'year']
    )
)

# Reset only the 'year' level, keep 'region' as index
df2 = df.reset_index(level='year')
print(df2)
#         year  revenue
# region
# East    2023      100
# East    2024      150
# West    2023      200
# West    2024      220

理解度チェック

インデックスの設定とリセットについて、理解度を確認しましょう。

レッスンのまとめ

このレッスンでは、set_index('col')で列を行インデックスにしてラベルベースのアクセスを可能にできること、リストを渡すとMultiIndexが作成されること、そしてreset_index()でインデックスを列に戻せること(破棄する場合はdrop=Trueを使います)を学びました。reindex()を使うと、欠損位置をNaNで埋めながら、完全な対象インデックスに揃えられます。これらのテクニックは、これから学ぶGroupByとMergingのレッスンの基礎になります。

よくある質問

「インデックスの設定とリセット」レッスンは無料ですか?

はい。「インデックスの設定とリセット」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Pandas & NumPy Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Pandas & NumPy Academyコースには全4レッスンが含まれています。

「インデックスの設定とリセット」で何を学びますか?

set_index()で列を行インデックスに設定し、reset_index()で元に戻して、MultiIndexの概要を理解します。 ブラウザで直接実行するハンズオンコードでPandas & NumPy Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Pandas & NumPy Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPandas & NumPy Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「インデックスの設定とリセット」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPandas & NumPy Academyレッスンでコードを書いて実行できますか?

はい。すべてのPandas & NumPy Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 列の値による並べ替え
  2. インデックスによる並べ替え
  3. 値の順位付け
  4. インデックスの設定とリセット
← Pandas & NumPy Academyに戻る