🐈

DataFrameやSeriesからデータを取得する

2022/03/23に公開約7,000字

at iat loc iloc プロパティ

atiatlociloc は値を取得する時に利用するDataFrame および Series のプロパティ です。プロパティのため () のような丸括弧ではなく、[] のような角括弧を利用して値を取得します。

プロパティ 位置の指定方法 取得できるデータ
at - 行名(行ラベル)
- 列名(列ラベル)
単一の値
iat - 行番号
- 列番号
単一の値
loc - 行名(行ラベル)
- 列名(列ラベル)
単一の値や複数の値 (SeriesまたはDataFrame
iloc - 行番号
- 列番号
単一の値や複数の値 (SeriesまたはDataFrame

処理速度に関しては、 at および iatのほうが高速です。

import pandas as pd
df = pd.DataFrame(
    [
        [173, 70.0],
        [172, 63.0],
	[178, 75.8],
	[170, 54],
        [178, 68.0],
	[174, 56],
	[169, 60],
	[169, 60],
    ],
    index = ["有田", "上田", "徳井", "名倉", "原田", "福田", "堀内", "堀内"],
    columns=["身長", "体重"]
)

at プロパティ

https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.at.html

at は主に列ラベルと行ラベルを利用して単一のデータを指定します。

使い方
df.at[行ラベル, 列ラベル]

  • データを取得する
df.at["有田", "身長"] # "有田" の "身長" を取得
df.at["有田", "体重"] # "有田" の "体重" を取得 
df.at["上田", "体重"] # "上田" の "体重" を取得 
  • 新しい値を設定する
df.at["徳井", "体重"] = 70.8 # "徳井" の "体重" を変更
  • Series から値を取得する
df.loc["有田"].at["身長"] # "有田" の "身長" を取得

iat プロパティ

https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.iat.html

iatindex (行名) や columns (列名)ではなく、行番号や列番号で指定します。

使い方
df.iat[行番号, 列番号]

  • データを取得する
df.iat[0, 0] # "有田" の "身長" を取得
df.iat[0, 1] # "有田" の "体重" を取得 
df.iat[1, 1] # "上田" の "体重" を取得 
  • 新しい値を設定する
df.iat[2, 0] = 70.8 # "徳井" の "体重" を変更
  • Series から値を取得する
df.loc["有田"].iat[0] # "有田" の "身長" を取得

loc プロパティ

https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.loc.html

loc は主に列ラベルおよび行ラベルを利用してデータを指定します。行ラベルや列ラベル以外にも Bool型の配列でも指定できます。
17370.0 などの単一の値。DataFrame 型または Series 型のデータを取得できます。

主な取得するデータの指定方法

  • "身長""有田" などの単一のラベル(位置ではなくあくまでラベルです)。
  • ["身長", "体重"] などのラベルのリスト
  • "有田":"徳井" などのラベルを利用したスライス
  • [True, False, True] のような bool 型の配列も利用できます。

使い方
df.loc[行ラベル, 列ラベル]

  • 行ラベル で指定
df.loc["有田",:]
df.loc[["有田"],:]
df.loc[["有田","上田"],:]
df.loc[[True, False, True, False, True, False, True, False], :]
  • 列ラベル で指定
df.loc[:, "身長"]
df.loc[:, ["身長"]]
df.loc[:, ["身長", "体重"]]
df.loc[:, [True, False]]

取得できる値のデータ型は絞り込み結果により異なります。

  • DataFrame型: 複数の列と複数の行の場合。
  • Series型: 単一の列と複数の行 または 複数の列と単一の行 に絞り込まれた場合。
  • 単一の値:上記以外
>>> type(df.loc[["有田"], :])
<class 'pandas.core.frame.DataFrame'>

>>> type(df.loc[:, ["身長"]])
<class 'pandas.core.frame.DataFrame'>

>>> type(df.loc["堀内", :])
<class 'pandas.core.frame.DataFrame'>

>>> type(df.loc[:, "身長"])
<class 'pandas.core.series.Series'>

>>> type(df.loc["有田", :])
<class 'pandas.core.series.Series'>

>>> type(df.loc["有田", "身長"])
<class 'numpy.float64'>

iloc プロパティ

https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.iloc.html

ilocindex (行名) や columns (列名)ではなく、行番号や列番号で指定します。行番号や列番号以外にも Bool型の配列でも指定できます。
17370.0 などの単一の値。DataFrame 型または Series 型のデータを取得できます。

主な取得するデータの指定方法

  • 3 などの整数 (locとは逆で位置で指定します)。
  • [3, 4, 5] などの整数のリスト。
  • 0:3 などの整数を利用したスライス (左記の例の場合 loc と違い、3は含みません)。
  • [True, False] などの bool型の配列(動作は loc と同様です。)。

使い方
df.iloc[行番号, 列番号]

  • 行番号で指定
df.iloc[0, :]      # 行: "有田" を取得
df.iloc[[0], :]    # 行: "有田" を取得
df.iloc[[0,1], :]  # 行: "有田" "上田" を取得
df.iloc[[True, False, True, False, True, False, True, False], :]
  • 列番号で指定
df.iloc[:, 0]     # 列: "身長" を取得
df.iloc[:, [0]]   # 列: "身長" を取得
df.iloc[:, [0,1]] # 列: "身長" "体重" を取得
df.iloc[:, [True, False]]

取得できる値のデータ型は絞り込み結果により異なります。

  • DataFrame型: 複数の列と複数の行の場合。
  • Series型: 単一の列と複数の行 または 複数の列と単一の行 に絞り込まれた場合。
  • 単一の値:上記以外
>>> type(df.iloc[[0], :])
<class 'pandas.core.frame.DataFrame'>

>>> type(df.iloc[:, [0]])
<class 'pandas.core.frame.DataFrame'>

>>> type(df.iloc[:, 0])
<class 'pandas.core.series.Series'>

>>> type(df.iloc[0, :])
<class 'pandas.core.series.Series'>

>>> type(df.iloc[0, 0])
<class 'numpy.float64'>

headtail メソッド

headtail メソッド は先頭から数件取得したり、末尾から数件取得できます。
headtailDataFrame および Series のメソッドです。

  • head: 先頭数件を表示。
  • tail: 末尾数件を表示。

使い方
DataFrame.head(n=5)
DataFrame.tail(n=5)

引数

引数 型名 説明
n int 初期値(=5)。取得する行数。

戻り値
DataFrame または Series

import pandas as pd


df = pd.DataFrame({
  '出席番号': [1,2,3,4,5,6,7],
  '名前': ["有田", "上田", "徳井", "名倉", "原田", "福田", "堀内"],
  '身長': [173, 172, 178, 170, 178, 174, 169]
})

s = pd.Series([173, 172, 178, 170, 178, 174, 169])

type(df.head()) # DataFrame.headの戻り値の型
type(s.tail())  # Series.headの戻り値の型

df.head()  # 先頭から5件を取得
df.tail()  # 末尾から5件を取得
df.head(3) # 末尾から3件を取得
df.head(2).append(df.tail(2)) # 先頭2件と末尾2件を取得

type(df.head())
type(df.tail())

query メソッド

使い方
DataFrame.query()

引数

引数 型名 説明
expr str 抽出するための条件式。
inplace bool 初期値(=False)。元の DataFrame のデータを修正するか、修正したコピーの DataFrame を返す。

戻り値
DataFrame または None

今回は Iris.csv を元にデータを抽出します。

データフレームのCSV
import pandas as pd

df = pd.read_csv("https://gist.githubusercontent.com/netj/8836201/raw/6f9306ad21398ea43cba4f7d537619d0e07d5ae3/iris.csv")

print(df)

"""Output
     sepal.length  sepal.width  petal.length  petal.width    variety
0             5.1          3.5           1.4          0.2     Setosa
1             4.9          3.0           1.4          0.2     Setosa
2             4.7          3.2           1.3          0.2     Setosa
3             4.6          3.1           1.5          0.2     Setosa
4             5.0          3.6           1.4          0.2     Setosa
..            ...          ...           ...          ...        ...
145           6.7          3.0           5.2          2.3  Virginica
146           6.3          2.5           5.0          1.9  Virginica
147           6.5          3.0           5.2          2.0  Virginica
148           6.2          3.4           5.4          2.3  Virginica
149           5.9          3.0           5.1          1.8  Virginica

[150 rows x 5 columns]
"""
  • 列: sepal.width が 2.0 以上 2.5 以下のデータ
df.query('`sepal.width` >= 2.0 and `sepal.width` <= 2.5')
  • 列: varietySetosa のデータ
df.query('variety == "Setosa"')

ポイント

  • expr内で文字列で抽出する場合は、"<絞り込み文字列>"のように ダブルクォーテーションで囲む
  • expr内で記号を利用する場合は、 `列名`のように、バッククォートで囲む

Discussion

ログインするとコメントできます