Pandas & NumPy Academy · レッスン

列と行の選択

ブラケット記法で1列または複数列を選択し、.locと.ilocを使ってラベルと位置で行を取得します。

レッスン 2/413 ステップ

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

1列を選択する

ブラケット記法df['col']を使って列名で1列にアクセスすると、Seriesが返されます。列名がスペースを含まない有効なPython識別子であれば、ドット記法df.colも使えます。ブラケット記法は常に安全ですが、ドット記法はcountやmeanのようにDataFrameのメソッド名と競合する列名では使えません。

import pandas as pd

df = pd.DataFrame({'name': ['Alice', 'Bob'], 'score': [90, 75]})
print(df['name'])     # Series
print(type(df['name']))  # pandas.core.series.Series

複数の列を選択する

複数の列を選択するには、ブラケット内に列名のリストを渡します:df[['col1', 'col2']]。二重のブラケットに注意してください。外側はインデックス演算子、内側はPythonのリストを作成するためのものです。結果はSeriesではなくDataFrameになります。機械学習用の特徴量行列を取り出す際によく使われます。

import pandas as pd

df = pd.DataFrame({'a': [1,2], 'b': [3,4], 'c': [5,6]})
subset = df[['a', 'c']]
print(type(subset))      # pandas.core.frame.DataFrame
print(subset)

.locで行と列を選択する

df.loc[row_label, col_label]はラベルでデータを選択します。行と列の両方に、単一のラベル、ラベルのリスト、またはスライスを指定できます。df.loc[:, 'score']は'score'列のすべての行を選択します。df.loc['r1':'r3', ['a', 'b']]は、列aとbについて、r1からr3までの行(r3を含む)を選択します。

import pandas as pd

df = pd.DataFrame({'x': [10,20,30], 'y': [40,50,60]},
                  index=['r1', 'r2', 'r3'])
print(df.loc['r2', 'x'])       # 20
print(df.loc['r1':'r2', 'y'])  # r1:40  r2:50

.ilocで位置を指定して選択する

df.iloc[row_pos, col_pos]はラベルを無視し、整数位置で選択します。どちらの引数も、終端を含まないPythonのスライス規則に従います。df.iloc[:, 0]は最初の列をSeriesとして選択します。df.iloc[0:2, 1:3]は左上から2×2の長方形のサブDataFrameを選択します。

import pandas as pd

df = pd.DataFrame({'a': [1,2,3], 'b': [4,5,6], 'c': [7,8,9]})
print(df.iloc[1, 2])        # 8  -- row 1, col 2
print(df.iloc[0:2, 0:2])   # top-left 2x2 sub-table

booleanで行を選択する

DataFrameと同じインデックスを持つboolean Seriesを.locに渡すと、行をフィルタリングできます。boolean Seriesは列の条件から作成します。条件は&と|で組み合わせられます。これはPandasのデータ分析における標準的なフィルタリング方法で、複数列にまたがる複雑な条件ではSQLのWHERE句よりもはるかに柔軟です。

import pandas as pd

df = pd.DataFrame({'name': ['A','B','C','D'], 'score': [80,55,92,71]})
high = df.loc[df['score'] >= 70]
print(high)
#   name  score
# 0    A     80
# 2    C     92
# 3    D     71

複合的なフィルタリング条件

複数の条件はそれぞれ括弧で囲み、&(AND)または|(OR)で結合する必要があります。SeriesにPythonのand/orキーワードを使うとエラーになります。条件を否定するには、notではなく~(チルダ)を使います。予期しない結果の原因を切り分けるため、結合する前に各条件を個別に確認してください。

import pandas as pd

df = pd.DataFrame({'name': ['A','B','C','D'],
                   'score': [80, 55, 92, 71],
                   'dept': ['Eng', 'HR', 'Eng', 'HR']})
filtered = df.loc[(df['score'] >= 70) & (df['dept'] == 'Eng')]
print(filtered)

整数位置で行を選択する

df.iloc[n]はn番目の行をSeriesとして返します。df.iloc[n:m]はn行目からm-1行目までをDataFrameとして返します。df.iloc[[0, 2, 4]]は、ファンシーインデックスを使って位置で特定の行を選択します。これはNumPy配列の行選択と同等で、機械学習モデルを適用する前の訓練データとテストデータの分割によく使われます。

import pandas as pd

df = pd.DataFrame({'a': range(5), 'b': range(5, 10)})
print(df.iloc[0])         # first row as Series
print(df.iloc[1:3])       # rows 1 and 2 as DataFrame
print(df.iloc[[0, 4]])    # first and last row

行と列の選択を組み合わせる

.locと.ilocはいずれも2つの引数を受け取ります:df.loc[row_selector, col_selector]。これにより、1つの式で長方形の範囲を正確に選択できます。単独のコロン:は、すべての行またはすべての列を選択します。この方法は、データセットの訓練用の行だけから、特定の列を持つ特徴量行列を取り出す際に不可欠です。

import pandas as pd

df = pd.DataFrame({'x': [1,2,3], 'y': [4,5,6], 'z': [7,8,9]})
# Filter rows where x > 1, keep columns y and z
result = df.loc[df['x'] > 1, ['y', 'z']]
print(result)
#    y  z
# 1  5  8
# 2  6  9

.locで1行を選択する

df.loc[label]に単一のスカラーラベルを渡すと、列名をインデックスとするSeriesが返されます。特定のレコードを確認する際に便利です。1行のDataFrameとして取得するには、ラベルをリストで囲みます:df.loc[[label]]。DataFrameを想定する関数に結果を渡す場合、この違いが重要になります。

import pandas as pd

df = pd.DataFrame({'name': ['A','B'], 'score': [80, 90]},
                  index=['r1', 'r2'])
print(type(df.loc['r1']))    # Series
print(type(df.loc[['r1']])) # DataFrame

高速なスカラーアクセスに使う at と iat

df.at[row_label, col_name]とdf.iat[row_pos, col_pos]は、.loc/.ilocよりオーバーヘッドが小さく、単一のスカラー値を取得または設定します。個々のセルを更新するループ用に設計されています。本番コードではセルごとの更新よりベクトル化された操作を常に優先すべきですが、実際に反復処理が必要な場合はat/iatを使います。

import pandas as pd

df = pd.DataFrame({'x': [1, 2, 3], 'y': [4, 5, 6]},
                  index=['a', 'b', 'c'])
print(df.at['b', 'y'])    # 5
print(df.iat[2, 0])       # 3

連鎖インデックスに関する警告

df['col'][condition]やdf[mask]['col'] = valのような連鎖インデックスでは、Pandasが元のDataFrameではなくコピーを操作する可能性があるため、SettingWithCopyWarningが発生することがあります。変更を行う場合は、必ず単一の.loc式を使ってください:df.loc[mask, 'col'] = val。これが、警告を発生させない正しい方法です。

import pandas as pd

df = pd.DataFrame({'score': [80, 55, 92]})
# WRONG - may not modify original:
# df[df['score'] > 60]['score'] = 100

# CORRECT:
df.loc[df['score'] > 60, 'score'] = 100
print(df)

理解度チェック

このレッスンで学んだ、列と行の選択方法について理解度を確認しましょう。

レッスンのまとめ

このレッスンでは、.locは終端を含むスライスでラベルによって行と列を選択すること、.ilocはPythonのスライスと同じく終端を含まない形式で整数位置によって選択すること、そして.locにboolean条件を適用すると、連鎖インデックスによるSettingWithCopyWarningを避けながら行をフィルタリングできることを学びました。次は、新しい計算列を追加し、既存の列名を変更し、drop()で不要な列を削除します。

無料で開始

AI チューターと学ぶ Python — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
30
レッスン
120

よくある質問

「列と行の選択」レッスンは無料ですか?

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

「列と行の選択」で何を学びますか?

ブラケット記法で1列または複数列を選択し、.locと.ilocを使ってラベルと位置で行を取得します。 ブラウザで直接実行するハンズオンコードでPandas & NumPy Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「列と行の選択」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. DataFrameの作成
  2. 列と行の選択
  3. 列の追加と削除
  4. DataFrameの基本的な確認
← Pandas & NumPy Academyに戻る