Python環境を起動中... 初回のみ数秒かかります
Lesson 8 / 12

列の加工と追加

このレッスンで学ぶこと

  • 計算で新しい列を追加できる(BMI列など)
  • apply で各値に自分の処理を適用できる
  • map / replace で値を置き換えられる
  • astype で列の型を変換できる

1. データを「加工」する

データを読み込んで眺めたら、次は分析しやすい形に加工します。よくある加工は次のようなものです。

これらはすべて、「列を作る・変える」操作です。pandasなら、どれも数行で書けます。

2. 計算で新しい列を作る

新しい列を作る一番簡単な方法は、df["新しい列名"] = 計算式 です。 既存の列同士の計算結果を、そのまま新しい列として追加できます。

sample_1.py
Ctrl+Enter
出力

💡 列同士の計算は「行ごと」に行われる: df["体重"] / df["身長"]**2 は、各行(各患者)ごとに計算されます。 3人分のBMIが一度に計算され、新しい列になります。 ループを書かずに「全員分まとめて計算」できるのが、pandasの便利なところです。

3. apply — 各値に自分の処理を適用

「値に応じて分類したい」「複雑な変換をしたい」ときは apply(関数) を使います。 列の各値に対して、指定した関数を1つずつ適用してくれます。 lambda(その場で作る小さな関数)と組み合わせるのが定番です。

sample_2.py
Ctrl+Enter
出力

💡 lambda x: ... の読み方: lambda x: "高い" if x >= 140 else "正常" は「x を受け取り、140以上なら『高い』、そうでなければ『正常』を返す」関数です。 apply はこの関数を、列の各値(各患者のSBP)に適用します。 条件分岐を伴う列の作成は、この apply + lambda が定番パターンです。

🩺 医療データ文脈: 検査値から「基準値内/要注意/異常」を判定する、年齢から「小児/成人/高齢者」を分類する—— こうした「数値を意味のあるカテゴリに変換する」処理は、医療データ分析で頻出です。 apply を使えば、自分のルールで自由に分類できます。

4. map・replace・astype — 値の置換と型変換

決まった対応関係で値を置き換えたいときは mapreplace、 列の型を変えたいときは astype を使います。

map:辞書で値を一括変換

map(辞書) は「コード → 名称」のような決まった変換に便利です。 辞書のキーに一致する値を、対応する値に置き換えます。 (注意:対応表に無い値は NaN になります

replace:特定の値だけ置き換える

replace(辞書) も値の置換ですが、対応表に無い値はそのまま残す点が map と違います。 「一部の表記ゆれだけ直したい」「特定の値だけ書き換えたい」ときは replace が安全です (例:"HT"→"高血圧" だけ直し、すでに正しい "高血圧" はそのまま残す)。

astype:列の型を変換

CSVなどで数字が文字列として読み込まれた場合、astype(int)astype(float) で 数値型に変換できます。逆に astype(str) で文字列にもできます。

sample_3.py
Ctrl+Enter
出力

💡 map と apply の違い:

  • map(辞書)決まった対応表で置き換える(コード→名称など)
  • apply(関数)条件や計算を伴う柔軟な変換(140以上なら…など)

「単純な置き換えはmap、ロジックが必要ならapply」と覚えると使い分けやすいです。

5. 練習問題

問題 1

計算で新しい列を作ろう

下記の df に、「脈圧」列(=SBP − DBP)を新しく追加して表示してください。

exercise_1.py
出力
ヒントを見る(答え+解説)
import pandas as pd

df = pd.DataFrame({
    "氏名": ["田中", "佐藤", "鈴木"],
    "SBP":  [120, 145, 130],
    "DBP":  [80, 92, 85],
})

# 「脈圧」列(SBP - DBP)を追加して表示してください
df["脈圧"] = df["SBP"] - df["DBP"]
print(df)   # 脈圧: 田中40, 佐藤53, 鈴木45

df["脈圧"] = df["SBP"] - df["DBP"] で、各行ごとに引き算した結果が新しい列になります。脈圧は 田中40・佐藤53・鈴木45 です。

問題 2

applyで判定列を作ろう

下記の df に、BMIから判定する 「肥満度」列apply で作ってください。
ルール:BMIが25以上なら「肥満」、そうでなければ「標準」。

exercise_2.py
出力
ヒントを見る(答え+解説)
import pandas as pd

df = pd.DataFrame({
    "氏名": ["田中", "佐藤", "鈴木", "高橋"],
    "BMI":  [22.5, 28.1, 24.0, 30.5],
})

# BMI25以上なら「肥満」、そうでなければ「標準」の列を apply で作ってください
df["肥満度"] = df["BMI"].apply(lambda x: "肥満" if x >= 25 else "標準")
print(df)
# 肥満度: 田中=標準, 佐藤=肥満, 鈴木=標準, 高橋=肥満

apply(lambda x: "肥満" if x >= 25 else "標準") で、BMIの各値を判定して分類できます。佐藤(28.1)と高橋(30.5)が「肥満」、田中(22.5)と鈴木(24.0)が「標準」になります。

問題 3

mapでコードを名称に変換しよう

下記の df性別コード(1=男性、2=女性)を、map「性別」列に変換してください。

exercise_3.py
出力
ヒントを見る(答え+解説)
import pandas as pd

df = pd.DataFrame({
    "氏名":     ["田中", "佐藤", "鈴木", "高橋"],
    "性別コード": [1, 2, 1, 2],
})

# 1=男性, 2=女性 に変換した「性別」列を map で作ってください
df["性別"] = df["性別コード"].map({1: "男性", 2: "女性"})
print(df)
# 性別: 田中=男性, 佐藤=女性, 鈴木=男性, 高橋=女性

map({1: "男性", 2: "女性"}) で、コードを対応する名称に一括変換できます。「コード→名称」のような決まった対応表での変換は、map が最適です。

6. まとめ

このレッスンのポイント

  • df["新列"] = 計算式 で計算結果を新しい列にできる(行ごとに計算)
  • apply(関数):各値に処理を適用。lambda で条件分岐も書ける
  • map(辞書):対応表で値を置換(対応表に無い値は NaN になる)
  • replace(辞書):指定した値だけ置換(対象外はそのまま残す)
  • astype(型):列の型を変換(文字列の数字→数値 など)
  • 単純な置き換えは map / replace、ロジックが必要なら apply

自由に試してみましょう:

free_practice.py
出力

完了するとコース一覧に進捗が記録されます