CSVを読み込んだあとに、次のように思ったことはありませんか。
- 「単価」と「数量」から「売上」列を作りたい
- 点数から「合格」「不合格」の判定列を作りたい
- 日付列から「月」だけを取り出した列を作りたい
df['列名'] = ...、assign()、loc、insert()のどれを使えばよいかわからない- 列を追加したはずなのに、元のDataFrameに反映されない
Pandasで新しい列を追加するとき、初心者はまず df['列名'] = 入れたい値 という考え方を覚えるのがおすすめです。
# 基本形(説明用)
# df['列名'] = 入れたい値
既存列から計算したい場合は、次のように書きます。
df['売上'] = df['単価'] * df['数量']
この記事では、Pandasで新しい列を追加する基本、既存列から計算列を作る方法、条件に応じて分類列を作る方法、assign()・loc・insert() の使い分け、反映されない原因を初心者向けに整理します。
最初からすべての書き方を覚える必要はありません。まずは 普通の列追加は df['列名'] = ...、条件で分けるときは np.where() または loc、処理をつなげたいときは assign() という大枠を押さえれば十分です。
- この記事でわかること
- 先にイメージ:新しい列を追加すると何が変わるのか
- Pandas DataFrame入門シリーズでの位置づけ
- 先に結論:新しい列を追加するときの使い分け
- サンプルデータを作成する
- 基本:df['列名'] = 入れたい値 で列を追加する
- 固定値を入れた列を追加する
- 既存列から計算列を作る
- 条件に応じて分類列を追加する
- 日付列から月を作る例|詳しい日付変換はto_datetime記事へ
- df['列名']・assign()・loc・insert()の違い
- assign()で新しい列を追加する
- insert()で列の位置を指定して追加する
- locで条件に合う行だけ値を入れる
- 新しい列が反映されない原因
- 前処理・集計・可視化の流れで考える
- まとめ
- 次に読みたい関連記事
この記事でわかること
この記事では、次の内容を学びます。
- Pandasで新しい列を追加する基本形
- 固定値・計算結果・条件判定を新しい列として追加する方法
df['列名']、assign()、loc、insert()の使い分け- 新しい列が反映されない原因と確認ポイント
- 追加した列を
value_counts()やgroupby()に活かす流れ
PandasのDataFrameそのものがまだ不安な場合は、先に「Pandas DataFrame入門」で、行・列・インデックスの基本を確認しておくと理解しやすくなります。
先にイメージ:新しい列を追加すると何が変わるのか
新しい列を追加するとは、今あるDataFrameに「分析しやすい情報」を増やすことです。
たとえば、次のように考えるとイメージしやすくなります。
| 処理前 | 追加する列 | 処理後にできること |
|---|---|---|
商品・単価・数量 がある |
売上 |
商品ごとの金額を確認できる |
点数 がある |
判定 |
合格・不合格の件数を数えられる |
購入日 がある |
購入月 |
月別に集計しやすくなる |
カテゴリ がある |
分類メモ |
集計や確認の目印にできる |
つまり、列追加は「表を横に広げる操作」ですが、目的は列を増やすこと自体ではありません。
次の確認・集計・可視化で使いやすい形にすることが目的です。
Pandas DataFrame入門シリーズでの位置づけ
このページは、Pandasでデータ分析を進めるための前処理記事です。
CSVを読み込んだあと、列名を整えたり、型を直したり、欠損値や表記ゆれを確認したりします。その後で、分析しやすいように「売上」「判定」「月」などの新しい列を作ることがあります。
新しい列を追加できるようになると、value_counts() で件数を確認したり、groupby() で集計したり、Matplotlibでグラフ化したりしやすくなります。
先に結論:新しい列を追加するときの使い分け
新しい列を追加するときは、目的に合わせて書き方を選びます。
ただし、最初から難しく考えなくて大丈夫です。初心者は、まず次の優先度で覚えると迷いにくくなります。
| 優先度 | やりたいこと | おすすめの書き方 | 使う場面 |
|---|---|---|---|
| 1 | 新しい列を普通に追加したい | df['列名'] = 入れたい値 |
一番基本。初心者はまずこれでOK |
| 2 | 既存列から計算列を作りたい | df['新列'] = df['列A'] * df['列B'] |
単価×数量、売上−費用など |
| 3 | 条件で値を分けたい | np.where() または loc |
合格/不合格、高い/低いなど |
| 4 | メソッドチェーンで書きたい | assign() |
処理をつなげて書きたいとき |
| 5 | 列の位置を指定したい | insert() |
先頭や特定の位置に列を入れたいとき |
初心者が最初に覚えるべき基本は、次の形です。
# 基本形(説明用)
# df['列名'] = 入れたい値
この記事では、まず df['列名'] = ... を中心に理解し、そのあとで assign()、loc、insert() を「必要な場面だけ」使い分ける流れで解説します。
サンプルデータを作成する
ここでは、CSV読み込み後を想定した小さな売上データを使います。
実務では read_csv() でCSVファイルを読み込むことが多いですが、この記事ではGoogle Colabですぐ試せるように、コード内でDataFrameを作成します。
CSVの読み込みから確認したい場合は、「Google Colab CSV読み込み&保存入門」もあわせて確認してください。
import pandas as pd
import numpy as np
df = pd.DataFrame({
"商品": ["ノート", "ペン", "ファイル", "電卓", "ふせん"],
"カテゴリ": ["文房具", "文房具", "文房具", "事務用品", "文房具"],
"単価": [120, 80, 200, 1500, 100],
"数量": [3, 10, 2, 1, 5],
"点数": [72, 55, 88, 91, 60],
"購入日": ["2026-04-01", "2026-04-02", "2026-04-03", "2026-04-04", "2026-04-05"]
})
df
| 商品 | カテゴリ | 単価 | 数量 | 点数 | 購入日 | |
|---|---|---|---|---|---|---|
| 0 | ノート | 文房具 | 120 | 3 | 72 | 2026-04-01 |
| 1 | ペン | 文房具 | 80 | 10 | 55 | 2026-04-02 |
| 2 | ファイル | 文房具 | 200 | 2 | 88 | 2026-04-03 |
| 3 | 電卓 | 事務用品 | 1500 | 1 | 91 | 2026-04-04 |
| 4 | ふせん | 文房具 | 100 | 5 | 60 | 2026-04-05 |
このDataFrameには、商品名、カテゴリ、単価、数量、点数、購入日が入っています。
ここから、次のような新しい列を追加していきます。
| 追加したい列 | 作り方の例 | 目的 |
|---|---|---|
| メモ | 固定値を入れる | 全行に同じ情報を付ける |
| 売上 | 単価 × 数量 | 分析用の計算列を作る |
| 判定 | 点数が60点以上なら合格 | 条件に応じた分類列を作る |
| 購入月 | 購入日から月を取り出す | 日付を集計しやすくする |
このあと、固定値・計算列・条件付き列の順に確認します。
基本:df['列名'] = 入れたい値 で列を追加する
Pandasで新しい列を追加する基本形は、次のように考えます。
# 基本形(説明用)
# df['列名'] = 入れたい値
左側に追加したい列名を書き、右側に入れたい値を書きます。
まずは、全ての行に同じ値を入れる簡単な例から見てみましょう。
df_basic = df.copy()
df_basic["メモ"] = "確認済み"
df_basic
| 商品 | カテゴリ | 単価 | 数量 | 点数 | 購入日 | メモ | |
|---|---|---|---|---|---|---|---|
| 0 | ノート | 文房具 | 120 | 3 | 72 | 2026-04-01 | 確認済み |
| 1 | ペン | 文房具 | 80 | 10 | 55 | 2026-04-02 | 確認済み |
| 2 | ファイル | 文房具 | 200 | 2 | 88 | 2026-04-03 | 確認済み |
| 3 | 電卓 | 事務用品 | 1500 | 1 | 91 | 2026-04-04 | 確認済み |
| 4 | ふせん | 文房具 | 100 | 5 | 60 | 2026-04-05 | 確認済み |
メモ という新しい列が追加され、全ての行に 確認済み が入りました。
このように、1つの値を指定すると、DataFrameの全行に同じ値が入ります。
| 処理前の列 | 処理後の列 |
|---|---|
商品、カテゴリ、単価、数量、点数、購入日 |
商品、カテゴリ、単価、数量、点数、購入日、メモ |
列を追加するだけなら、この書き方がもっともシンプルです。
固定値を入れた列を追加する
固定値の列は、全ての行に同じラベルやメモを付けたいときに使います。
たとえば、データの出所や処理状態を残したい場合です。
df_fixed = df.copy()
df_fixed["データ種別"] = "サンプル"
df_fixed
| 商品 | カテゴリ | 単価 | 数量 | 点数 | 購入日 | データ種別 | |
|---|---|---|---|---|---|---|---|
| 0 | ノート | 文房具 | 120 | 3 | 72 | 2026-04-01 | サンプル |
| 1 | ペン | 文房具 | 80 | 10 | 55 | 2026-04-02 | サンプル |
| 2 | ファイル | 文房具 | 200 | 2 | 88 | 2026-04-03 | サンプル |
| 3 | 電卓 | 事務用品 | 1500 | 1 | 91 | 2026-04-04 | サンプル |
| 4 | ふせん | 文房具 | 100 | 5 | 60 | 2026-04-05 | サンプル |
データ種別 列が追加され、全ての行に サンプル が入りました。
固定値を入れる列追加は、次のような場面で使えます。
- 複数のCSVを結合する前に、どのファイル由来かを示したい
- 処理済みデータに
確認済みなどのメモを入れたい - サンプルデータと本番データを区別したい
ただし、列を追加しすぎるとDataFrameが見づらくなります。必要な列だけを追加する意識も大切です。
既存列から計算列を作る
新しい列追加で特によく使うのが、既存列を使って計算列を作る方法です。
たとえば、単価 と 数量 から 売上 列を作る場合は、次のように書きます。
df_sales = df.copy()
df_sales["売上"] = df_sales["単価"] * df_sales["数量"]
df_sales
| 商品 | カテゴリ | 単価 | 数量 | 点数 | 購入日 | 売上 | |
|---|---|---|---|---|---|---|---|
| 0 | ノート | 文房具 | 120 | 3 | 72 | 2026-04-01 | 360 |
| 1 | ペン | 文房具 | 80 | 10 | 55 | 2026-04-02 | 800 |
| 2 | ファイル | 文房具 | 200 | 2 | 88 | 2026-04-03 | 400 |
| 3 | 電卓 | 事務用品 | 1500 | 1 | 91 | 2026-04-04 | 1500 |
| 4 | ふせん | 文房具 | 100 | 5 | 60 | 2026-04-05 | 500 |
売上 列が追加され、単価 × 数量 の結果が入りました。
| 処理前 | 処理後 |
|---|---|
| 単価と数量はあるが、売上はない | 単価と数量から売上列を作成 |
| 商品ごとの合計金額がすぐには見えない | 商品ごとの売上が確認しやすい |
このような計算列は、集計や可視化の前処理としてよく使います。
たとえば、あとでカテゴリ別の売上を集計したい場合、先に 売上 列を作っておくと groupby() につなげやすくなります。
df_sales.groupby("カテゴリ")["売上"].sum()
| 売上 | |
|---|---|
| カテゴリ | |
| 事務用品 | 1500 |
| 文房具 | 2060 |
このように、新しい列を追加する目的は、単に列を増やすことではありません。
分析しやすい形にデータを整えることが目的です。
数値計算がうまくいかない場合は、列が文字列型になっている可能性があります。その場合は、astype() などで型を確認・変換してから計算する流れになります。
条件に応じて分類列を追加する
次に、条件に応じて値を変える列を追加します。
たとえば、点数 が60点以上なら 合格、60点未満なら 不合格 とする 判定 列を作ります。
初心者には、まず np.where() がわかりやすいです。
df_result = df.copy()
df_result["判定"] = np.where(df_result["点数"] >= 60, "合格", "不合格")
df_result
| 商品 | カテゴリ | 単価 | 数量 | 点数 | 購入日 | 判定 | |
|---|---|---|---|---|---|---|---|
| 0 | ノート | 文房具 | 120 | 3 | 72 | 2026-04-01 | 合格 |
| 1 | ペン | 文房具 | 80 | 10 | 55 | 2026-04-02 | 不合格 |
| 2 | ファイル | 文房具 | 200 | 2 | 88 | 2026-04-03 | 合格 |
| 3 | 電卓 | 事務用品 | 1500 | 1 | 91 | 2026-04-04 | 合格 |
| 4 | ふせん | 文房具 | 100 | 5 | 60 | 2026-04-05 | 合格 |
点数 に応じて、判定 列が追加されました。
| 処理前 | 処理後 |
|---|---|
| 点数だけがある | 点数から合格/不合格がわかる |
| 条件を毎回見ないと判断できない | 判定列で分類しやすい |
np.where() は、次の形で考えると理解しやすいです。
# 基本形(説明用)
# np.where(条件, 条件に合うときの値, 条件に合わないときの値)
今回の場合は、次の意味になります。
np.where(df_result["点数"] >= 60, "合格", "不合格")
条件付きで列を追加すると、あとで value_counts() で件数を確認しやすくなります。
df_result["判定"].value_counts()
| count | |
|---|---|
| 判定 | |
| 合格 | 4 |
| 不合格 | 1 |
このように、分類列を追加してから件数を確認すると、データ全体の特徴をつかみやすくなります。
条件に合う行を抽出する方法を詳しく知りたい場合は、「pandas 条件抽出」の記事につなげると理解しやすいです。今回の記事では、抽出そのものではなく「条件に応じて列の値を作る」ことに絞ります。
日付列から月を作る例|詳しい日付変換はto_datetime記事へ
日付データでは、日付そのものだけでなく、月や曜日を取り出して新しい列にすることがあります。
ここでは、列追加の例として 購入日 から 購入月 を作ります。
日付変換そのものを詳しく解説する章ではなく、日付型に変換したあと、新しい列を作ると分析しやすくなる という位置づけで確認します。
df_date = df.copy()
df_date["購入日"] = pd.to_datetime(df_date["購入日"])
df_date["購入月"] = df_date["購入日"].dt.month
df_date
| 商品 | カテゴリ | 単価 | 数量 | 点数 | 購入日 | 購入月 | |
|---|---|---|---|---|---|---|---|
| 0 | ノート | 文房具 | 120 | 3 | 72 | 2026-04-01 | 4 |
| 1 | ペン | 文房具 | 80 | 10 | 55 | 2026-04-02 | 4 |
| 2 | ファイル | 文房具 | 200 | 2 | 88 | 2026-04-03 | 4 |
| 3 | 電卓 | 事務用品 | 1500 | 1 | 91 | 2026-04-04 | 4 |
| 4 | ふせん | 文房具 | 100 | 5 | 60 | 2026-04-05 | 4 |
購入日 から 購入月 列を作ることができました。
日付列を使う場合は、先に pd.to_datetime() で日付型に変換しておくと、.dt.month のような日付用の操作が使いやすくなります。
ただし、この記事の中心は「新しい列を追加する方法」です。日付変換の詳しい考え方、format、errors='coerce'、NaT の扱いは、別記事の「pandas to_datetime()」で確認してください。
df['列名']・assign()・loc・insert()の違い
ここまで見てきたように、列追加の基本は df['新しい列'] = ... です。
ただし、Pandasには他にも列を追加する方法があります。初心者が混乱しやすいので、違いを表で整理します。
| 書き方 | 主な用途 | 初心者向けの考え方 |
|---|---|---|
df['新しい列'] = ... |
普通に列を追加・上書きする | まず覚える基本形 |
assign() |
新しいDataFrameとして列を追加する | メソッドチェーン向き |
loc |
条件に合う行だけ値を入れる | 条件付きの代入に便利 |
insert() |
指定した位置に列を追加する | 列の場所にこだわるときだけ使う |
基本は df['新しい列'] = ... で十分です。
assign()、loc、insert() は、必要になったときに使い分ければ大丈夫です。
assign()で新しい列を追加する
assign() は、新しい列を追加したDataFrameを返すメソッドです。
メソッドチェーンで処理をつなげたいときに便利です。
まずは、assign() で 売上 列を作ってみます。
df_assign = df.assign(
売上 = df["単価"] * df["数量"]
)
df_assign
| 商品 | カテゴリ | 単価 | 数量 | 点数 | 購入日 | 売上 | |
|---|---|---|---|---|---|---|---|
| 0 | ノート | 文房具 | 120 | 3 | 72 | 2026-04-01 | 360 |
| 1 | ペン | 文房具 | 80 | 10 | 55 | 2026-04-02 | 800 |
| 2 | ファイル | 文房具 | 200 | 2 | 88 | 2026-04-03 | 400 |
| 3 | 電卓 | 事務用品 | 1500 | 1 | 91 | 2026-04-04 | 1500 |
| 4 | ふせん | 文房具 | 100 | 5 | 60 | 2026-04-05 | 500 |
assign() でも、売上 列を追加できました。
ただし、ここで大事なのは、assign() は元のDataFrameを直接書き換えるというより、列を追加した新しいDataFrameを返すという点です。
そのため、元の df に反映したい場合は、次のように代入します。
df_assigned = df.copy()
df_assigned = df_assigned.assign(
売上 = df_assigned["単価"] * df_assigned["数量"]
)
df_assigned
| 商品 | カテゴリ | 単価 | 数量 | 点数 | 購入日 | 売上 | |
|---|---|---|---|---|---|---|---|
| 0 | ノート | 文房具 | 120 | 3 | 72 | 2026-04-01 | 360 |
| 1 | ペン | 文房具 | 80 | 10 | 55 | 2026-04-02 | 800 |
| 2 | ファイル | 文房具 | 200 | 2 | 88 | 2026-04-03 | 400 |
| 3 | 電卓 | 事務用品 | 1500 | 1 | 91 | 2026-04-04 | 1500 |
| 4 | ふせん | 文房具 | 100 | 5 | 60 | 2026-04-05 | 500 |
assign() は便利ですが、初心者のうちは次のように考えると迷いにくいです。
| 目的 | おすすめ |
|---|---|
| 普通に列を追加したい | df['新しい列'] = ... |
| 処理をつなげて書きたい | assign() |
assign() で lambda を使う書き方もありますが、この記事では深入りしません。
まずは、assign() は新しいDataFrameを返すため、元の変数に反映したいなら代入する という点を押さえましょう。ここは「列を追加したのに反映されない」と感じやすいポイントです。
insert()で列の位置を指定して追加する
insert() は、列を追加する位置を指定したいときに使います。
ただし、初心者が最初に覚えるべき方法ではありません。普通に列を追加するだけなら、df['新しい列'] = ... で十分です。
insert() は、作成した列を先頭や特定の位置に置きたい場合だけ使う、と考えると迷いにくくなります。
ここでは、先頭に No 列を追加してみます。
df_insert = df.copy()
df_insert.insert(0, "No", range(1, len(df_insert) + 1))
df_insert
| No | 商品 | カテゴリ | 単価 | 数量 | 点数 | 購入日 | |
|---|---|---|---|---|---|---|---|
| 0 | 1 | ノート | 文房具 | 120 | 3 | 72 | 2026-04-01 |
| 1 | 2 | ペン | 文房具 | 80 | 10 | 55 | 2026-04-02 |
| 2 | 3 | ファイル | 文房具 | 200 | 2 | 88 | 2026-04-03 |
| 3 | 4 | 電卓 | 事務用品 | 1500 | 1 | 91 | 2026-04-04 |
| 4 | 5 | ふせん | 文房具 | 100 | 5 | 60 | 2026-04-05 |
insert(0, "No", ...) と書いたので、先頭に No 列が入りました。
insert() は次の形で使います。
# 基本形(説明用)
# df.insert(追加する位置, 列名, 入れたい値)
今回の場合は、次の意味です。
# 今回の例
# df_insert.insert(0, "No", range(1, len(df_insert) + 1))
ただし、列の位置を指定する必要がない場合は、無理に insert() を使わなくて大丈夫です。
locで条件に合う行だけ値を入れる
loc は、条件に合う行だけに値を入れたいときに使えます。
ここでは、まず全員を 確認中 にしてから、点数が60点以上の行だけ 合格 に変更してみます。
df_loc = df.copy()
df_loc["判定"] = "確認中"
df_loc.loc[df_loc["点数"] >= 60, "判定"] = "合格"
df_loc.loc[df_loc["点数"] < 60, "判定"] = "不合格"
df_loc
| 商品 | カテゴリ | 単価 | 数量 | 点数 | 購入日 | 判定 | |
|---|---|---|---|---|---|---|---|
| 0 | ノート | 文房具 | 120 | 3 | 72 | 2026-04-01 | 合格 |
| 1 | ペン | 文房具 | 80 | 10 | 55 | 2026-04-02 | 不合格 |
| 2 | ファイル | 文房具 | 200 | 2 | 88 | 2026-04-03 | 合格 |
| 3 | 電卓 | 事務用品 | 1500 | 1 | 91 | 2026-04-04 | 合格 |
| 4 | ふせん | 文房具 | 100 | 5 | 60 | 2026-04-05 | 合格 |
loc を使うと、条件に合う行だけを指定して値を入れられます。
np.where() と loc のざっくりした使い分けは次の通りです。
| 方法 | 向いている場面 |
|---|---|
np.where() |
2択の条件で列を作りたいとき |
loc |
条件に合う行だけあとから値を入れたいとき |
どちらも条件付きで列を作る方法ですが、初心者はまず2択なら np.where()、条件に合う行へ段階的に値を入れたいなら loc と考えるとよいです。
新しい列が反映されない原因
Pandasで列を追加したつもりなのに、思ったように反映されないことがあります。
よくある原因を先に整理します。
| 原因 | 起きること | 確認ポイント |
|---|---|---|
| 代入していない | 結果を表示しただけで元のDataFrameが変わらない | df = ... と代入しているか |
| 列名を打ち間違えた | 意図しない別列ができる | df.columns で列名を確認 |
| 既存列と同じ名前を使った | 新規追加ではなく上書きになる | 既存列名と重複していないか |
| 値の長さが行数と合わない | エラーになる | リストの長さと行数が一致しているか |
| 文字列の数値を計算した | 計算結果が想定と違う | df.dtypes で型を確認 |
ここから、代表的な例を確認します。
原因1:assign()の結果を代入していない
assign() は、新しいDataFrameを返します。
そのため、結果を元の変数に入れないと、元のDataFrameは変わりません。
df_miss = df.copy()
# これは新しいDataFrameを返しますが、df_missには代入していません
df_miss.assign(売上 = df_miss["単価"] * df_miss["数量"])
# df_miss自体には「売上」列が追加されていません
df_miss
| 商品 | カテゴリ | 単価 | 数量 | 点数 | 購入日 | |
|---|---|---|---|---|---|---|
| 0 | ノート | 文房具 | 120 | 3 | 72 | 2026-04-01 |
| 1 | ペン | 文房具 | 80 | 10 | 55 | 2026-04-02 |
| 2 | ファイル | 文房具 | 200 | 2 | 88 | 2026-04-03 |
| 3 | 電卓 | 事務用品 | 1500 | 1 | 91 | 2026-04-04 |
| 4 | ふせん | 文房具 | 100 | 5 | 60 | 2026-04-05 |
元のDataFrameに反映したい場合は、次のように代入します。
df_miss = df.copy()
df_miss = df_miss.assign(売上 = df_miss["単価"] * df_miss["数量"])
df_miss
| 商品 | カテゴリ | 単価 | 数量 | 点数 | 購入日 | 売上 | |
|---|---|---|---|---|---|---|---|
| 0 | ノート | 文房具 | 120 | 3 | 72 | 2026-04-01 | 360 |
| 1 | ペン | 文房具 | 80 | 10 | 55 | 2026-04-02 | 800 |
| 2 | ファイル | 文房具 | 200 | 2 | 88 | 2026-04-03 | 400 |
| 3 | 電卓 | 事務用品 | 1500 | 1 | 91 | 2026-04-04 | 1500 |
| 4 | ふせん | 文房具 | 100 | 5 | 60 | 2026-04-05 | 500 |
原因2:列名を打ち間違えて別の列ができる
df['列名'] = ... は、指定した列名が存在しない場合、新しい列を作ります。
これは便利ですが、列名を打ち間違えると、意図しない別列が作られることがあります。
df_typo = df.copy()
# 本当は「売上」としたいのに、「売り上げ」と書いてしまった例
df_typo["売り上げ"] = df_typo["単価"] * df_typo["数量"]
df_typo.columns
Index(['商品', 'カテゴリ', '単価', '数量', '点数', '購入日', '売り上げ'], dtype='object')
このようなときは、df.columns で列名を確認しましょう。
列名がわかりにくい場合は、先に rename() で列名を整えてから新しい列を作ると、ミスを減らしやすくなります。
原因3:既存列と同じ名前を書くと上書きになる
df['列名'] = ... は、新しい列を追加するだけでなく、既存列を上書きすることもできます。
たとえば、すでにある 単価 列に別の値を入れると、元の 単価 は上書きされます。
df_overwrite = df.copy()
# 既存の「単価」列を上書きしてしまう例
df_overwrite["単価"] = df_overwrite["単価"] * 1.1
df_overwrite
| 商品 | カテゴリ | 単価 | 数量 | 点数 | 購入日 | |
|---|---|---|---|---|---|---|
| 0 | ノート | 文房具 | 132.0 | 3 | 72 | 2026-04-01 |
| 1 | ペン | 文房具 | 88.0 | 10 | 55 | 2026-04-02 |
| 2 | ファイル | 文房具 | 220.0 | 2 | 88 | 2026-04-03 |
| 3 | 電卓 | 事務用品 | 1650.0 | 1 | 91 | 2026-04-04 |
| 4 | ふせん | 文房具 | 110.0 | 5 | 60 | 2026-04-05 |
この例では、単価 が1.1倍されています。
これは意図していれば問題ありませんが、新しい列を作りたいだけなら、別の列名を使いましょう。
df['税込単価'] = df['単価'] * 1.1
上書きが不安な場合は、処理前に df.copy() でコピーを作って試すと安心です。
原因4:渡す値の長さが行数と合わない
新しい列にリストを入れる場合、リストの長さはDataFrameの行数と一致している必要があります。
次のコードは、行数とリストの長さが合わないため、エラーになります。
df_length = df.copy()
# このコードはエラーになります。
# df_lengthは5行ですが、リストは3個しかありません。
# df_length["ランク"] = ["A", "B", "C"]
エラーになる例はコメントアウトしています。
リストで列を追加する場合は、次のように行数と同じ長さにします。
df_length = df.copy()
df_length["ランク"] = ["B", "C", "A", "A", "B"]
df_length
| 商品 | カテゴリ | 単価 | 数量 | 点数 | 購入日 | ランク | |
|---|---|---|---|---|---|---|---|
| 0 | ノート | 文房具 | 120 | 3 | 72 | 2026-04-01 | B |
| 1 | ペン | 文房具 | 80 | 10 | 55 | 2026-04-02 | C |
| 2 | ファイル | 文房具 | 200 | 2 | 88 | 2026-04-03 | A |
| 3 | 電卓 | 事務用品 | 1500 | 1 | 91 | 2026-04-04 | A |
| 4 | ふせん | 文房具 | 100 | 5 | 60 | 2026-04-05 | B |
行数と同じ長さのリストを渡すと、上から順番に値が入ります。
ただし、初心者のうちは、手作業で長いリストを作るより、既存列から計算したり、条件で作ったりする方がミスを減らしやすいです。
原因5:文字列の数値をそのまま計算しようとしている
CSVから読み込んだデータでは、数値に見えても文字列として扱われていることがあります。
文字列のまま計算しようとすると、思った結果にならないことがあります。
df_str = pd.DataFrame({
"商品": ["A", "B", "C"],
"単価": ["100", "200", "300"],
"数量": [2, 3, 4]
})
df_str.dtypes
| 0 | |
|---|---|
| 商品 | object |
| 単価 | object |
| 数量 | int64 |
単価 が object になっている場合、文字列として扱われている可能性があります。
計算列を作る前に、数値型へ変換してから計算します。
df_str["単価"] = df_str["単価"].astype(int)
df_str["売上"] = df_str["単価"] * df_str["数量"]
df_str
| 商品 | 単価 | 数量 | 売上 | |
|---|---|---|---|---|
| 0 | A | 100 | 2 | 200 |
| 1 | B | 200 | 3 | 600 |
| 2 | C | 300 | 4 | 1200 |
このように、列追加の前には、必要に応じて型を確認することも大切です。
型変換について詳しく知りたい場合は、「pandas astype()」の記事につなげると理解しやすくなります。
前処理・集計・可視化の流れで考える
新しい列を追加する操作は、単体で終わるものではありません。
データ分析では、次のような流れの中で使うことが多いです。
- CSVを読み込む
head()やinfo()でデータを確認するrename()で列名を整えるastype()やto_datetime()で型を整えるfillna()やreplace()で欠損値・表記ゆれを整える- 新しい列を追加する
value_counts()やgroupby()で集計する- Matplotlibで可視化する
つまり、新しい列を追加する処理は、確認済みのデータを、分析しやすい形に変える前処理です。
たとえば、この記事で作った 売上 列は、カテゴリ別の売上集計に使えます。
df_flow = df.copy()
df_flow["売上"] = df_flow["単価"] * df_flow["数量"]
category_sales = df_flow.groupby("カテゴリ")["売上"].sum()
category_sales
| 売上 | |
|---|---|
| カテゴリ | |
| 事務用品 | 1500 |
| 文房具 | 2060 |
また、判定 のような分類列を作ると、件数確認にも使えます。
df_flow["判定"] = np.where(df_flow["点数"] >= 60, "合格", "不合格")
df_flow["判定"].value_counts()
| count | |
|---|---|
| 判定 | |
| 合格 | 4 |
| 不合格 | 1 |
このように、新しい列は「分析しやすい形に整えるための前処理」として役立ちます。
単に列を増やすのではなく、次の集計・抽出・可視化で使うために列を作る、と考えると実務でも迷いにくくなります。
補足:apply()や複雑な書き方は最初から使わなくてもよい
列を追加する方法を調べると、apply() や assign() の lambda を使った例が出てくることがあります。
ただし、初心者が最初からこれらを多用する必要はありません。
まずは、次の方法で十分なことが多いです。
- 普通の列追加:
df['新しい列'] = ... - 既存列から計算:
df['売上'] = df['単価'] * df['数量'] - 2択の条件分岐:
np.where() - 条件に合う行への代入:
loc
なお、assign() では lambda を使って列を追加する書き方もあります。また、np.where() を重ねると複数条件にも対応できます。
ただし、これらは少し発展的です。初心者のうちは、まず df['列名'] = ...、np.where()、loc の基本を押さえてから学ぶのがおすすめです。
この記事では、複雑な apply()、lambda、複数条件の詳しい書き方には深入りせず、「新しい列を追加する基本」を優先します。
まとめ
この記事では、Pandasで新しい列を追加する方法を解説しました。
ポイントを整理します。
- 新しい列を追加する基本は
df['列名'] = 入れたい値 - 既存列から計算列を作る場合は、
df['売上'] = df['単価'] * df['数量']のように書く - 条件に応じて値を分ける場合は、まず
np.where()やlocを使う assign()はメソッドチェーン向きだが、元のDataFrameに反映したい場合は代入が必要insert()は列の位置を指定したいときに使う- 列が反映されない場合は、代入忘れ、列名ミス、既存列の上書き、値の長さ、型を確認する
- 新しい列は、前処理・集計・可視化へ進むための準備として役立つ
初心者は、まず次の順番で覚えると迷いにくいです。
- 普通の列追加:
df['列名'] = 入れたい値 - 既存列から計算列を作る:
df['売上'] = df['単価'] * df['数量'] - 条件付き列を作る:
np.where()またはloc - 必要に応じて:
assign()やinsert()
新しい列を作れるようになると、CSVを読み込んだあとの前処理だけでなく、value_counts()、groupby()、Matplotlibによる可視化にもつなげやすくなります。
次に読みたい関連記事
今回の記事とあわせて読むと、Pandasの前処理から集計までの流れが理解しやすくなります。
新しい列を追加する前に「列名」「型」「欠損値」「表記ゆれ」を整え、追加した列を value_counts() や groupby() に進める流れで読むのがおすすめです。
- Pandas DataFrame入門|作り方・基本操作をわかりやすく解説
- Google Colab CSV 読み込み&保存入門|pandas で read_csv と to_csv を徹底解説
- pandas rename()の使い方|列名変更・一部だけ変更・反映されない原因を初心者向けに解説
- pandas astype()の使い方|文字列・数値への型変換とエラー対処を初心者向けに解説
- pandas to_datetime()の使い方|文字列の日付変換と format・NaT 対処を初心者向けに解説
- pandas replace()の使い方|値の置換・表記ゆれ・欠損値変換を解説
- pandas fillna()の使い方|欠損値を0・平均値・中央値・最頻値で埋める方法を初心者向けに解説
- pandas 条件抽出(filtering)入門|AND/OR・query関数・複数条件の指定方法
- pandas value_counts()の使い方|件数集計・割合表示・欠損値の数え方を解説
- Pandas groupby×aggの使い方|基本の集計とaggの書き方を例で解説
コメント