pandas.DataFrame, Seriesの先頭・末尾の行を返すheadとtail

Modified: | Tags: Python, pandas

pandasでDataFrameSeriesから先頭(最初)と末尾(最後)の行・要素を取得するにはhead()tail()メソッドを使う。

サイズが大きいDataFrameSeriesのデータを確認するときに使えるほかのメソッドとして、行・列をランダムサンプリングする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()メソッドは先頭(最初)の行を返す。

デフォルトは先頭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

スライスで行番号を指定して取得

スライスで行番号を指定して任意の位置の行を取得することもできる。

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についての詳細は以下の記事を参照。

関連カテゴリー

関連記事