pandas.DataFrame, Seriesの先頭・末尾の行を返すheadとtail
pandasでDataFrame
やSeries
から先頭(最初)と末尾(最後)の行・要素を取得するにはhead()
とtail()
メソッドを使う。
サイズが大きいDataFrame
やSeries
のデータを確認するときに使えるほかのメソッドとして、行・列をランダムサンプリングするsample()
もある。
本記事のサンプルコードのpandasのバージョンは以下の通り。バージョンによって仕様が異なる可能性があるので注意。例として10行のDataFrame
を使う。
import pandas as pd
print(pd.__version__)
# 2.1.4
df = pd.DataFrame({'col_0': list('ABCDEFGHIJ'), 'col_1': range(9, -1, -1)},
index=[f'row_{i}' for i in range(10)])
print(df)
# col_0 col_1
# row_0 A 9
# row_1 B 8
# row_2 C 7
# row_3 D 6
# row_4 E 5
# row_5 F 4
# row_6 G 3
# row_7 H 2
# row_8 I 1
# row_9 J 0
例はDataFrame
だが、Series
でもhead()
とtail()
が用意されている。引数など、使い方は同じ。
先頭(最初)の行を返すhead()
head()
メソッドは先頭(最初)の行を返す。
デフォルトは先頭5行分。
print(df.head())
# col_0 col_1
# row_0 A 9
# row_1 B 8
# row_2 C 7
# row_3 D 6
# row_4 E 5
第一引数n
を指定すると先頭n
行が返される。
print(df.head(3))
# col_0 col_1
# row_0 A 9
# row_1 B 8
# row_2 C 7
末尾(最後)の行を返すtail()
tail()
メソッドは末尾(最後)の行を返す。
デフォルトは末尾5行分。
print(df.tail())
# col_0 col_1
# row_5 F 4
# row_6 G 3
# row_7 H 2
# row_8 I 1
# row_9 J 0
第一引数n
を指定すると末尾n
行が返される。
print(df.tail(3))
# col_0 col_1
# row_7 H 2
# row_8 I 1
# row_9 J 0
スライスで行番号を指定して取得
スライスで行番号を指定して任意の位置の行を取得することもできる。
- 関連記事: pandasのインデックス指定で行・列を抽出
print(df[3:6])
# col_0 col_1
# row_3 D 6
# row_4 E 5
# row_5 F 4
スライスを使ってhead()
とtail()
と同様の処理を行うことも可能。
print(df[:5])
# col_0 col_1
# row_0 A 9
# row_1 B 8
# row_2 C 7
# row_3 D 6
# row_4 E 5
print(df[-5:])
# col_0 col_1
# row_5 F 4
# row_6 G 3
# row_7 H 2
# row_8 I 1
# row_9 J 0
先頭行・最終行の要素の値を取得
head()
やtail()
の引数に1
を指定すると先頭行または最終行を取得できるが、一行だけでも型はDataFrame
。
print(df.head(1))
# col_0 col_1
# row_0 A 9
print(type(df.head(1)))
# <class 'pandas.core.frame.DataFrame'>
iloc
を使って一行だけを指定すると、指定行をSeries
で取得できる。iloc[0]
で先頭行、iloc[-1]
で最終行を取得できる。
要素の値を取得したい場合はiloc[0]['列名']
, iloc[-1]['列名']
のようにすればよい。
print(df.iloc[0])
# col_0 A
# col_1 9
# Name: row_0, dtype: object
print(type(df.iloc[0]))
# <class 'pandas.core.series.Series'>
print(df.iloc[0]['col_0'])
# A
print(df.iloc[-1])
# col_0 J
# col_1 0
# Name: row_9, dtype: object
print(type(df.iloc[-1]))
# <class 'pandas.core.series.Series'>
print(df.iloc[-1]['col_0'])
# J
値を代入する場合は上の書き方だとSettingWithCopyWarning
という警告が出るので注意。
df.iloc[0]['col_0'] = 'AAA'
# /var/folders/rf/b7l8_vgj5mdgvghn_326rn_c0000gn/T/ipykernel_48384/183824280.py:1: SettingWithCopyWarning:
# A value is trying to be set on a copy of a slice from a DataFrame
SettingWithCopyWarning
を防ぐには、index
属性から列名を取得してat
で指定する方法がある。loc
でもよいが、要素の取得・代入にはat
のほうが高速。
df.at[df.index[0], 'col_0'] = 'AAA'
df.at[df.index[-1], 'col_0'] = 'JJJ'
print(df)
# col_0 col_1
# row_0 AAA 9
# row_1 B 8
# row_2 C 7
# row_3 D 6
# row_4 E 5
# row_5 F 4
# row_6 G 3
# row_7 H 2
# row_8 I 1
# row_9 JJJ 0
at
, iat
, loc
, iloc
についての詳細は以下の記事を参照。