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を確認してください。