この記事ではPandasにおける要素を抽出する方法について解説していきます。
目次
Udemyの動画学習でもPythonを勉強しよう!
「平日の夜の勉強会には時間が間に合わなくて参加できない」「通勤時間のわずかな隙間時間を勉強時間にあてたい」「本ではよく分からないところを動画で理解を深めたい」そんなあなたはUdemyの動画学習がお勧めです!
UdemyのPythonおすすめ33講座レビューリスト任意の位置の値を取得、変更するat、iat、loc、iloc
pandas.Dataframeの任意の位置のデータを取り出したり、変更したりする場合には、at, iat, loc, ilocを使います。以下のように違いがあります。
・at、loc:ラベル名指定 iat、iloc:行列番号指定
・at、iat:1つの要素 loc、iloc:1つ、もしくは複数の要素
実際にDataframeを使って確かめてみましょう。Dataframeには以下のデータを使います。
data = pd.DataFrame(np.array([[80, 70, 80], [60, 60, 60], [90, 80, 70], [40, 50, 40], [50, 80, 90]]), columns=["Math", "English", "Physics"], index=["Tanaka", "Suzuki", "Sato", "Yamada", "Ogawa"])
print(data)
# Math English Physics# Tanaka 80 70 80# Suzuki 60 60 60# Sato 90 80 70# Yamada 40 50 40# Ogawa 50 80 90
print(data.index.values) # dataの行のラベル
# ['Tanaka' 'Suzuki' 'Sato' 'Yamada' 'Ogawa']
print(data.columns.values) # dataの列のラベル
# ['Math' 'English' 'Physics']
at、iatで1つの要素を取得、変更する
まず、atでは行と列をラベルの名前で指定します。データを取得するだけでなく、その位置に新しい値を代入することができます。
print(data.at['Tanaka', 'Math']) # atではラベル名で指定
print(data.at['Yamada', 'English'])
# 80
# 50
data.at['Suzuki', 'Math'] = 70 # SuzukiのMathに70を代入
print(data.at['Suzuki', 'Math'])
# 70
次に、iatでは行番号と列番号で位置を指定します。atと同じように、データを取得するだけでなく、その位置に新しい値を代入することができます。
print(data.iat[1, 0]) # iatでは行列番号で指定
print(data.iat[3, 1])
# 70
# 50
data.iat[1, 0] = 80 # 位置[1, 0]に80を代入する
print(data.iat[1, 0])
# 80
loc、ilocで1つ、もしくは複数の要素を取得、変更する
loc、ilocでは1つ、もしくは複数の要素を取得、変更することができます。
1つの要素の際には、at、iatのほうが高速に取得することができます。
locは行と列をラベルの名前で指定します。複数の要素を取得するには、リストやスライスを用います。
スライス(start:stop:step)を用いる場合、locでラベル名を指定するときはstopのラベルも指定範囲に含まれる点に注意が必要です。
# -----1つの要素を取得、代入-----
print(data.loc['Tanaka', 'English']) # locではラベル名で指定
print(data.iloc[0, 1])
# 70
# 70
data.loc['Tanaka', 'English'] = 80 # TanakaのEnglishに80を代入する
print(data.loc['Tanaka', 'English'])
# 80
data.iloc[1, 1] = 80 # ilocでは行列番号を指定
print(data.iloc[1, 1])
# 80
# -----複数の要素を取得、代入-----
print(data.loc['Tanaka':'Sato', 'Math']) # スライスを用いて複数の要素を指定
# Tanaka 80
# Suzuki 80
# Sato 90
# Name: Math, dtype: int64
print(type(data.loc['Tanaka':'Sato', 'Math']))
# <class 'pandas.core.series.Series'>
print(data.loc[:'Tanaka', ['Math', 'English']])
# Math English
# Tanaka 80 80
print(type(data.loc[:'Tanaka', ['Math', 'English']]))
# <class 'pandas.core.frame.DataFrame'>
print(data.iloc[:2, [0, 1]]) # ilocでは行列番号を指定
# Math English
# Tanaka 80 80
# Suzuki 80 80
print(type(data.iloc[:2, [0, 1]]))
# <class 'pandas.core.frame.DataFrame'>
# -----stepを使うと奇数、偶数行を取得-----
print(data.iloc[::2, 0]) # Mathの偶数要素を抽出
# Tanaka 80
# Sato 90
# Name: Math, dtype: int64
print(type(data.iloc[::2, 0]))
# <class 'pandas.core.series.Series'>
print(data.iloc[1::2, 0]) # Mathの奇数要素を抽出
# Suzuki 80
# Yamada 40
# Name: Math, dtype: int64
print(type(data.iloc[1::2, 0]))
# <class 'pandas.core.series.Series'>
スライスを用いて複数の要素に代入することができます。
data.loc['Tanaka':'Sato', 'English'] = [50, 60, 70]
print(data.loc['Tanaka':'Sato', 'English'])
# Tanaka 50
# Suzuki 60
# Sato 70
# Name: English, dtype: int64
任意の行や列を選択する
index参照によって行や列を選択することができますが、loc、ilocを使うとより柔軟に選択することができます。
# -----index参照による行列の選択-----
print(data['Tanaka':'Sato'])
# Math English Physics
# Tanaka 80 80 80
# Suzuki 80 80 60
# Sato 90 80 70
print(data[:3])
# Math English Physics
# Tanaka 80 80 80
# Suzuki 80 80 60
# Sato 90 80 70
print(data["Physics"])
# Tanaka 80
# Suzuki 60
# Sato 70
# Yamada 40
# Ogawa 90
# Name: Physics, dtype: int64
print(data[['Math', 'Physics']])
# Math Physics
# Tanaka 80 80
# Suzuki 80 60
# Sato 90 70
# Yamada 40 40
# Ogawa 50 90
# -----loc、ilocによる行列の選択-----
print(data.loc['Ogawa'])
# Math 50
# English 80
# Physics 90
# Name: Ogawa, dtype: int64
print(data.loc[:, 'English':'Physics'])
# English Physics
# Tanaka 80 80
# Suzuki 80 60
# Sato 80 70
# Yamada 50 40
# Ogawa 80 90
print(data.iloc[1:3, 1:2])
# English
# Suzuki 80
# Sato 80
まとめ
今回は、PandasのDataframeにおける要素の取得や代入の仕方について解説しました。
Pandasでのデータ処理では必須になるのでよく学習しておきましょう。
Udemyの動画学習でもPythonを勉強しよう!
「平日の夜の勉強会には時間が間に合わなくて参加できない」「通勤時間のわずかな隙間時間を勉強時間にあてたい」「本ではよく分からないところを動画で理解を深めたい」そんなあなたはUdemyの動画学習がお勧めです!
UdemyのPythonおすすめ33講座レビューリスト