DataFrameやSeriesからデータを取得する
at iat loc iloc プロパティ
at 、 iat 、 loc 、 iloc は値を取得する時に利用する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 プロパティ
at は主に列ラベルと行ラベルを利用して単一のデータを指定します。
使い方
df.at[行ラベル, 列ラベル]
- データを取得する
df.at["有田", "身長"] # "有田" の "身長" を取得
df.at["有田", "体重"] # "有田" の "体重" を取得
df.at["上田", "体重"] # "上田" の "体重" を取得
- 新しい値を設定する
df.at["徳井", "体重"] = 70.8 # "徳井" の "体重" を変更
-
Seriesから値を取得する
df.loc["有田"].at["身長"] # "有田" の "身長" を取得
iat プロパティ
iat は index (行名) や 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 プロパティ
loc は主に列ラベルおよび行ラベルを利用してデータを指定します。行ラベルや列ラベル以外にも Bool型の配列でも指定できます。
173 や 70.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 プロパティ
iloc は index (行名) や columns (列名)ではなく、行番号や列番号で指定します。行番号や列番号以外にも Bool型の配列でも指定できます。
173 や 70.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'>
head と tail メソッド
head と tail メソッド は先頭から数件取得したり、末尾から数件取得できます。
head と tail は DataFrame および 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')
- 列:
varietyがSetosaのデータ
df.query('variety == "Setosa"')
ポイント
- expr内で文字列で抽出する場合は、
"<絞り込み文字列>"のように ダブルクォーテーションで囲む - expr内で記号を利用する場合は、
`列名`のように、バッククォートで囲む
Discussion