データ処理の過程では、既存の列の値を使って新しい列を作りたいケースが多々あります。たとえば、次のようなケースです。
- 列
"身長(cm)"
から、単位を変換した列"身長(m)"
を作りたい - 列
"稼働人数"
と列"稼働期間"
から、新しい列"工数"
(稼働人数 x 稼働期間)を作りたい - 列
"総購入金額"
の値によって、優良顧客か否かのフラグが格納された新しい列"有料顧客フラグ"
を作りたい
列の追加方法
前回のクエストで学んだように、 df[既存の列名] = 更新後の値
とすることで既存の列の値を更新できます。
同様に、df[新しい列名] = 新しい列の値
とすると、新しい列が追加されます。新しい列の値
の部分は、固定の値か、Series型の値(DataFrameの1列分のデータ)が使えます。
たとえば固定の値の場合、df[新しい列名] = 1
のように代入することで、「全てのデータに1
が格納された新しい列」が作成されます。
pandasでは、既存の列の値を使った演算が可能です。
たとえば df["A"] + 10
のように書くと、「列A
の各データに10を足したSeries」が生成されます。+
以外に、-
、*
、/
、//
、%
、**
など他の算術演算子も使えます。
固定の値同様、df[新しい列名] = Series
とすることで列を追加できます。そのため、df[新しい列名] = df["A"] + 10
のように書くと、「列A
の各データに10を足した結果」が新しい列として追加されます。
また、df["A"] + df["B"]
のように書くと、「列A
と列B
の各データを足し合わせたSeries」が生成されます。
import pandas as pd
# データの読み込み
df = pd.read_csv("dataset/physical_measurement_clean.csv")
df
Name | Height | Weight | Club | |
---|---|---|---|---|
0 | 佐藤 | 172 | 53 | 野球部 |
1 | 田中 | 160 | 50 | 合唱部 |
2 | 鈴木 | 165 | 58 | 美術部 |
3 | 高橋 | 170 | 59 | 美術部 |
4 | 伊藤 | 166 | 54 | サッカー部 |
5 | 山本 | 156 | 51 | 所属なし |
6 | 渡辺 | 163 | 58 | 所属なし |
全てのデータに”1年A組”という文字列が格納された新しい列Class
を作成しましょう。df[新しい列名] = 固定の値
とすると、全てのデータに指定した値が格納された新しい列が作成されます。
# 新しい列Classの作成(全て"1年A組")
df["Class"] = "1年A組"
df
Name | Height | Weight | Club | Class | |
---|---|---|---|---|---|
0 | 佐藤 | 172 | 53 | 野球部 | 1年A組 |
1 | 田中 | 160 | 50 | 合唱部 | 1年A組 |
2 | 鈴木 | 165 | 58 | 美術部 | 1年A組 |
3 | 高橋 | 170 | 59 | 美術部 | 1年A組 |
4 | 伊藤 | 166 | 54 | サッカー部 | 1年A組 |
5 | 山本 | 156 | 51 | 所属なし | 1年A組 |
6 | 渡辺 | 163 | 58 | 所属なし | 1年A組 |
df[]=と=でつなぐと新しい列ができる。
次に、列Height
の単位をcmからmに変換して、列HeightM
を作成しましょう。df[“Height”] / 100と書くと、「各行の列Height
の値をそれぞれ100で割ったSeries」が得られます。
# 100で割って身長の単位をcmからmに変換
df["Height"] / 100
0 1.72 1 1.60 2 1.65 3 1.70 4 1.66 5 1.56 6 1.63 Name: Height, dtype: float64
計算した結果を、新しい列として追加しましょう。先ほどと同様、=
を使って新しい列を作成できます。(=がないと新しい列が出来ない)
# 新しい列HeightMを作成
df["HeightM"] = df["Height"] / 100
df
Name | Height | Weight | Club | Class | HeightM | |
---|---|---|---|---|---|---|
0 | 佐藤 | 172 | 53 | 野球部 | 1年A組 | 1.72 |
1 | 田中 | 160 | 50 | 合唱部 | 1年A組 | 1.60 |
2 | 鈴木 | 165 | 58 | 美術部 | 1年A組 | 1.65 |
3 | 高橋 | 170 | 59 | 美術部 | 1年A組 | 1.70 |
4 | 伊藤 | 166 | 54 | サッカー部 | 1年A組 | 1.66 |
5 | 山本 | 156 | 51 | 所属なし | 1年A組 | 1.56 |
6 | 渡辺 | 163 | 58 | 所属なし | 1年A組 | 1.63 |
最後に、列BMI
を追加しましょう。BMI(ボディー・マス・インデックス)とは肥満度を表す指数で、身長と体重から計算できます。
BMI = 体重kg ÷ (身長m × 身長m)
ここでは、列Weight
と列HeightM
の値を使って計算しましょう。
# 列の値を使ってBMIを計算
df["Weight"] / df["HeightM"] ** 2
0 17.915089 1 19.531250 2 21.303949 3 20.415225 4 19.596458 5 20.956607 6 21.829952 dtype: float64
列Class
や列HeightM
同様、=
を使って新しい列を追加します。
# 新しい列BMIを作成
df["BMI"] = df["Weight"] / df["HeightM"] ** 2
df
Name | Height | Weight | Club | Class | HeightM | BMI | |
---|---|---|---|---|---|---|---|
0 | 佐藤 | 172 | 53 | 野球部 | 1年A組 | 1.72 | 17.915089 |
1 | 田中 | 160 | 50 | 合唱部 | 1年A組 | 1.60 | 19.531250 |
2 | 鈴木 | 165 | 58 | 美術部 | 1年A組 | 1.65 | 21.303949 |
3 | 高橋 | 170 | 59 | 美術部 | 1年A組 | 1.70 | 20.415225 |
4 | 伊藤 | 166 | 54 | サッカー部 | 1年A組 | 1.66 | 19.596458 |
5 | 山本 | 156 | 51 | 所属なし | 1年A組 | 1.56 | 20.956607 |
6 | 渡辺 | 163 | 58 | 所属なし | 1年A組 | 1.63 | 21.829952 |
コメント