Python

Pandasにおいて任意の値を取得する方法

By 2021年10月24日No Comments

この記事ではPandasにおける要素を抽出する方法について解説していきます。

任意の位置の値を取得、変更する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講座レビューリスト
HOSL

Author HOSL

More posts by HOSL