PythonのPandasでデータフレームに新しい列を追加する方法は、非常に柔軟で直感的です。
基本的な構文から、条件付き、関数適用、他の列との計算など、様々なケースがあります。
以下で体系的に詳しく解説していきます。
目次
基本構文:単一の値やリストを使って追加する
import pandas as pd
df = pd.DataFrame({
'名前': ['佐藤', '鈴木', '高橋'],
'年齢': [25, 30, 28]
})
# 新しい列「性別」を追加
df['性別'] = ['男性', '女性', '男性']
print(df)
出力
名前 年齢 性別
0 佐藤 25 男性
1 鈴木 30 女性
2 高橋 28 男性
ポイント
- リストの長さはデータフレームの行数と一致している必要があります。
- 単一の値を入れると全行に同じ値が設定されます。
df['国籍'] = '日本'
他の列を使って計算し、新しい列を追加
df['年齢+10'] = df['年齢'] + 10
これは単純な演算ですが、任意の数式や複雑なロジックも可能です。
apply()
関数とlambda
で列を追加
複雑な条件やロジックで新しい列を作る場合に便利です。
df['成人判定'] = df['年齢'].apply(lambda x: '成人' if x >= 20 else '未成年')
または、関数を定義してもOK。
def 年齢判定(age):
return '成人' if age >= 20 else '未成年'
df['成人判定'] = df['年齢'].apply(年齢判定)
複数の列を元にした新しい列
df['紹介'] = df['名前'] + 'さんは' + df['年齢'].astype(str) + '歳です。'
数値列を文字列に変換するには .astype(str)
が必要です。
条件付きで列を追加(np.where
)
複数条件で分類したいときには NumPy の np.where()
が便利です。
import numpy as np
df['年齢区分'] = np.where(df['年齢'] >= 30, '30代以上', '20代')
辞書やSeriesを使って列を追加
Seriesを使う
年収 = pd.Series([500, 600, 700], index=[0, 1, 2])
df['年収'] = 年収
辞書を使う
年収 = {0: 500, 1: 600, 2: 700}
df['年収'] = pd.Series(年収)
条件による複雑な分類:assign()
やloc
も活用可能
df.loc[df['年齢'] >= 30, 'シニア'] = True
df.loc[df['年齢'] < 30, 'シニア'] = False
もしくは、assign()
でチェーン風に書くことも可能。
df = df.assign(年齢グループ=lambda x: np.where(x['年齢'] < 30, '若年層', '中年層'))
新しい列を最後や特定の位置に挿入したい場合
insert()
を使うと任意の場所に列を追加できます
df.insert(1, 'ID', [101, 102, 103]) # 1列目にID列を挿入
新しい列を追加しながら既存の列を使わない(ダミーデータなど)
import random
df['乱数'] = [random.randint(0, 100) for _ in range(len(df))]
まとめ:よく使う構文リスト
方法 | コード例 | 用途 |
---|---|---|
値のリスト | df['列名'] = [1, 2, 3] | 定数や手動データ |
単一値 | df['列名'] = 0 | 全行同じ値 |
計算 | df['列名'] = df['A'] + df['B'] | 他列からの生成 |
条件付き | df['列名'] = df['A'].apply(lambda x: ... ) | ロジック分岐 |
np.where() | np.where(条件, A, B) | より高速で分岐処理向き |
insert() | df.insert(1, '列名', 値) | 列の順序を指定 |
assign() | df = df.assign(...) | チェーン構文での追加 |
以上、PythonのPandasのデータフレームに新しい列を追加する方法についてでした。
最後までお読みいただき、ありがとうございました。