条件で行や列を絞りこんで更新

前問では、df.loc[比較結果]とすることで特定の条件で行を取得できることを学びました。
同じ記述を使って、次のように新しい値に更新もできます。

df.loc[比較結果] = 新しい値 =1つは定義
NameAge
0Alice17
1Bob24
2Carol29

下記では、「Ageが20以上の行」の行(2行目と3行目)を更新しています。

df.loc[df.Age >= 20] = [["Ben", 14], ["Chuck", 15]]
df
NameAge
0Alice17
1Ben14
2Chuck15

行と同様に、列も条件による絞り込みができます。

例として「列の型がint」の列は下記のようにして取得できます。列の場合は、df.loc[:, 比較結果]とします。

sr = df.dtypes == int  # 比較結果 ==は条件のこと
df.loc[:, sr]  # srの要素がTrueの列を抜き出す
Age
017
114
215
https://images.pyq.jp/repo/prod/pandas_cond_loc_v2/pandas_cond_02.jpg

また、df.loc[行の比較結果, 列の比較結果]のように行と列の両方に条件を指定することもできます。

locはlocationの略。
ilocはindex locationの略 なので、数字でないとだめ。

たとえば、「Ageが16以下の列Name」は下記のように書きます。

# 行を条件で、列を列名で絞り込み
df.loc[df.Age <= 16, "Name"]
df.loc[条件の行,条件の列]

また、「Ageが16以下の列NameをBobとCarolに更新する」は下記のように書けます。

# 行を条件で、列を列名で絞り込んで更新
df.loc[df.Age <= 16, "Name"] = ["Bob", "Carol"]

ilocは、df.iloc[行の比較結果, 列の比較結果]のように比較結果を使うことはできません。条件を指定したいときは、ilocではなくlocを使いましょう。

NameHeightWeight
0佐藤17253
1田中16050
2鈴木16558
3長谷川16065
df.loc[df.Weight >= 55, "Height"] = 167
df

=は一つ。”Height”の前のdfはいらない。

NameHeightWeight
0佐藤17253
1田中16050
2鈴木16758
3長谷川16765

コメント

タイトルとURLをコピーしました