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