はじめに
Pandasは、Pythonでのデータ分析や操作において強力なライブラリです。Pandasの主要な機能の1つであるインデックスは、ユーザーがDataFrame内の特定の要素にアクセスして操作することを可能にします。Pandasには、ラベルベースのインデックス.loc
、位置ベースのインデックス.iloc
、ブールインデックス、そしてMultiIndexを使用した階層的なインデックスなど、さまざまなインデックス技術があります。
インデックスに加えて、スライシングはDataFrameの一部を行または列の範囲を指定して抽出することができる、Pandasのもう1つの重要な技術です。
この記事では、Pandas DataFramesにおけるインデックスとスライシングについて紹介します。
Pandasデータフレームのインデックス
Pandasのインデックスにより、DataFrame内の特定の要素にアクセスし、操作することができます。Pandasでは、インデックス付けのためのさまざまなテクニックがあり、これらのメソッドを理解することで、DataFramesのポテンシャルを引き出すことができます。
ラベルベースのインデックス: .loc
Pandasは、ラベルベースのインデックスのための.loc
属性を提供しています。このメソッドを使用すると、行と列にラベル(つまり、インデックスと列名)を使用してアクセスすることができます。構文は次のようになります。
df.loc[row_label, column_label]
ここで、dfはDataFrameを、row_label
はアクセスしたい行のインデックスラベルを、column_label
は列のラベルを表します。また、.loc
をスライスと共に使用して、複数の行または列を選択することもできます。
import pandas as pd
data = {'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]}
df = pd.DataFrame(data, index=['row1', 'row2', 'row3'])
# Select a single value
result = df.loc['row1', 'A'] # Output: 1
# Select a single row
result = df.loc['row1', :] # Output: A 1
# B 4
# C 7
# Select multiple rows and columns
result = df.loc[['row1', 'row2'], ['A', 'C']] # Output: A C
# row1 1 7
# row2 2 8
位置ベースのインデックス: .iloc
.iloc
属性は、位置ベースのインデックス付けに使用されます。これにより、整数のインデックス位置を使用してDataFrame内の要素にアクセスすることができます。.iloc
の構文は次のようになります。
df.iloc[row_position, column_position]
ここで、row_position
とcolumn_position
は、アクセスしたい行と列の整数のインデックス位置を表します。.loc
と同様に、.iloc
でもスライスを使用して複数の行または列を選択できます。
# Select a single value
result = df.iloc[0, 0] # Output: 1
# Select a single row
result = df.iloc[0, :] # Output: A 1
# B 4
# C 7
# Select multiple rows and columns
result = df.iloc[[0, 1], [0, 2]] # Output: A C
# row1 1 7
# row2 2 8
ブール配列によるインデックス
ブール配列を使用して、特定の条件に基づいて行または列をフィルタリングすることができます。この方法は、ブールインデックスまたはマスキングとも呼ばれます。構文は次のようになります。
df[boolean_array]
ここで、boolean_array
はTrue
とFalse
の値を持つ配列であり、アクセスしたい行または列に対応します。
# Select rows where column 'A' is greater than 1
mask = df['A'] > 1
result = df[mask] # Output: A B C
# row2 2 5 8
# row3 3 6 9
階層的インデックス: MultiIndex
Pandasは、行と列の両方に複数のレベルのインデックスラベルを持つことができる階層的なインデックス付けをサポートしています。MultiIndexオブジェクトを使用して、階層的なインデックスを作成および操作することができます。MultiIndex DataFrameを作成するための構文は次のとおりです。
df_multi = pd.DataFrame(data, index=pd.MultiIndex.from_tuples(index_tuples), columns=column_labels)
ここで、index_tuples
は階層的なインデックスラベルを含むタプルを表し、column_labels
は列のラベルを表します。
import pandas as pd
data = [[1, 2], [3, 4], [5, 6], [7, 8]]
index_tuples = [('A', 'x'), ('A', 'y'), ('B', 'x'), ('B', 'y')]
column_labels = ['col1', 'col2']
df_multi = pd.DataFrame(data, index=pd.MultiIndex.from_tuples(index_tuples), columns=column_labels)
# Output:
# col1 col2
# A x 1 2
# y 3 4
# B x 5 6
# y 7 8
MultiIndex DataFrame内のデータにアクセスするには、複数のラベルを使用して.loc
を使用できます。
# Select a single value
result = df_multi.loc[('A', 'x'), 'col1'] # Output: 1
# Select a single row
result = df_multi.loc[('A', 'x'), :] # Output: col1 1
# col2 2
# Select multiple rows and columns
result = df_multi.loc[(slice('A', 'B'), slice('x', 'y')), ['col1']]
# Output:
# col1
# A x 1
# y 3
# B x 5
# y 7
Pandas DataFramesでのスライシング
スライシングは、DataFrame内の範囲を指定して一部を抽出するテクニックです。この章では、様々なスライシング方法とそのアプリケーションについて紹介します。
行のスライシング
行のスライシングを使用すると、インデックスラベルまたは位置に基づいてDataFrame内の一連の連続した行を選択できます。.loc
属性を使用すると、ラベルベースのスライシングを、.iloc
属性を使用すると位置ベースのスライシングを行うことができます。行スライシングの構文は次のとおりです。
# Label-based slicing
df.loc[start_label:end_label]
# Position-based slicing
df.iloc[start_position:end_position]
ラベルベースのスライシング(.loc
)では、開始値と終了値の両方が含まれ、位置ベースのスライシング(.iloc
)では、終了値は含まれません。
import pandas as pd
data = {'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]}
df = pd.DataFrame(data, index=['row1', 'row2', 'row3'])
# Label-based slicing
result = df.loc['row1':'row2'] # Output: A B C
# row1 1 4 7
# row2 2 5 8
# Position-based slicing
result = df.iloc[0:2] # Output: A B C
# row1 1 4 7
# row2 2 5 8
列のスライシング
列のスライシングを使用すると、ラベルまたは位置に基づいてDataFrame内の連続する列を選択できます。.loc
属性を使用すると、ラベルベースのスライシングを、.iloc
属性を使用すると位置ベースのスライシングを行うことができます。列スライシングの構文は次のとおりです。
# Label-based slicing
df.loc[:, start_label:end_label]
# Position-based slicing
df.iloc[:, start_position:end_position]
行スライシングと同様に、ラベルベースのスライシング(.loc
)では開始値と終了値が含まれ、位置ベースのスライシング(.iloc
)では終了値は含まれません。
# Label-based slicing
result = df.loc[:, 'A':'B'] # Output: A B
# row1 1 4
# row2 2 5
# row3 3 6
# Position-based slicing
result = df.iloc[:, 0:2] # Output: A B
# row1 1 4
# row2 2 5
# row3 3 6
行と列の混合スライシング
場合によっては、行と列の両方を同時にスライスしたい場合があります。.loc
または.iloc
属性を使用して、行スライシングと列スライシングのテクニックを組み合わせることでこれを実現できます。
# Label-based slicing
result = df.loc['row1':'row2', 'A':'B'] # Output: A B
# row1 1 4
# row2 2 5
# Position-based slicing
result = df.iloc[0:2, 0:2] # Output: A B
# row1 1 4
# row2 2 5