HOWTO · Pandas

Pandas DataFrame の最初の行を取得する

iloc、head()、フィルタリング、query()、take()、スライスを使って Pandas DataFrame の最初の行を選択し、Series と DataFrame のどちらの結果にするか選ぶ方法を学びます。

このページの内容

df.iloc[0]を使うと最初の行をSeriesとして取得でき、df.head(1)なら1行のDataFrameのまま取得できます。条件に一致する最初の行を取り出すには、まず行を絞り込んでから、その結果の先頭を選びます。

例では、小さなDataFrameを使って選択された値と元の行ラベルを確認しやすくしています。各コードブロックは単独で実行でき、pandasをインストールしたPython環境で動作します。各例の後には、提供された実行結果が示されています。

pandas.DataFrame.ilocプロパティでPandas DataFrameの最初の行を取得する

pandas.DataFrame.ilocは、整数位置を指定して行や列を選択します。位置0は、インデックスラベルに関係なく最初の行を表します。df.iloc[0]で1行を選ぶとSeriesが返り、そのインデックスにはDataFrameの列名が入ります。位置0の行にある位置1の値だけを選ぶには、df.iloc[0, 1]を使います。

import pandas as pd

df = pd.DataFrame(
    {
        "C_1": ["A", "B", "C", "D"],
        "C_2": [40, 34, 38, 45],
        "C_3": [430, 980, 200, 350],
    }
)

first_row = df.iloc[0]
print(first_row)
C_1      A
C_2     40
C_3    430
Name: 0, dtype: object

後続の計算や列名によるアクセスにSeriesが便利な場合は、この形式を使います。2次元のDataFrame形式を保つには、df.iloc[[0]]または以下のいずれかの方法を使います。

pandas.DataFrame.head()メソッドでPandas DataFrameの最初の行を取得する

pandas.DataFrame.head(n)は、先頭からn行をDataFrameとして返します。1を渡すと、列構造とインデックスラベルを保ったまま最初の1行だけを取得できます。後続のコードでDataFrameが必要な場合に、わかりやすい方法です。

import pandas as pd

df = pd.DataFrame(
    {
        "C_1": ["A", "B", "C", "D"],
        "C_2": [40, 34, 38, 45],
        "C_3": [430, 980, 200, 350],
    }
)

first_row = df.head(1)
print(first_row)
  C_1  C_2  C_3
0   A   40  430

重要なのは戻り値の形です。df.iloc[0]は1次元のSeriesですが、df.head(1)はDataFrameのままです。

指定した条件に基づいてPandas DataFrameの最初の行を取得する

最初に一致した行を選ぶ前に、行を絞り込みます。この例の条件はC_2 < 40かつC_3 > 450で、最初に一致する行のラベルは1です。&で2つの条件を組み合わせるため、ブールマスクでは各比較式を括弧で囲みます。

import pandas as pd

df = pd.DataFrame(
    {
        "C_1": ["A", "B", "C", "D"],
        "C_2": [40, 34, 38, 45],
        "C_3": [430, 980, 500, 350],
    }
)

matches = df[(df["C_2"] < 40) & (df["C_3"] > 450)]
first_match = matches.head(1)
print(first_match)
  C_1  C_2  C_3
1   B   34  980

一致する行がない場合、head(1)は空のDataFrameを返します。一致する場合にSeriesが必要なら、matches.iloc[0]で選択します。条件に一致する行がない可能性がある場合は、先にmatches.emptyを確認してください。

query()メソッドを使うと、同じフィルターを文字列で表現でき、列を使った式を読みやすく記述できます。述語はブールフィルターの例と一致させます。

import pandas as pd

df = pd.DataFrame(
    {
        "C_1": ["A", "B", "C", "D"],
        "C_2": [40, 34, 38, 45],
        "C_3": [430, 980, 500, 350],
    }
)

matches = df.query("(C_2 < 40) & (C_3 > 450)")
first_match = matches.head(1)
print(first_match)
  C_1  C_2  C_3
1   B   34  980

Python変数の値を使う場合は、query()式の中で@variableを使います。たとえば、limit = 40をdf.query("C_2 < @limit")のように参照できます。

pandas.DataFrame.take()メソッドでPandas DataFrameの最初の行を取得する

既定の行軸を使う場合、pandas.DataFrame.take()は位置を指定して行を選択します。[0]を渡すと、元のインデックスラベルを保った1行のDataFrameとして最初の行を取得できます。

import pandas as pd

df = pd.DataFrame(
    {
        "C_1": ["A", "B", "C", "D"],
        "C_2": [40, 34, 38, 45],
        "C_3": [430, 980, 200, 350],
    }
)

first_row = df.take([0])
print(first_row)
  C_1  C_2  C_3
0   A   40  430

行位置のリストがすでにある場合はtake()を使います。単純に最初の行を選ぶだけなら、head(1)やiloc[[0]]のほうが意図を直接伝えられることがあります。

スライスでPandas DataFrameの最初の行を取得する

スライスdf[:1]は、先頭から位置1の直前までの行を選びます。戻り値はDataFrameで、選択した行のインデックスラベルも保たれます。

import pandas as pd

df = pd.DataFrame(
    {
        "C_1": ["A", "B", "C", "D"],
        "C_2": [40, 34, 38, 45],
        "C_3": [430, 980, 200, 350],
    }
)

first_row = df[:1]
print(first_row)
  C_1  C_2  C_3
0   A   40  430

まとめ

Seriesが必要な場合はdf.iloc[0]を使い、1行のDataFrameが必要な場合はdf.head(1)、df.iloc[[0]]、df.take([0])、またはdf[:1]を使います。条件を満たす最初の行を取得するには、ブール条件またはquery()で絞り込んでから、絞り込み結果の先頭を選びます。一致する行がない可能性がある場合は、インデックスで選択する前にmatches.emptyを確認してください。