0Pricing
Pandas & NumPy Academy · レッスン

列の追加と削除

計算結果から新しい列を追加し、既存の列名を変更し、drop()で不要な列や行を削除します。

「列の追加と削除」はCoddyKit上の無料Pandas & NumPy Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPandas & NumPy Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Pandas & NumPy Academyコースには全4レッスンが含まれています。

代入によって新しい列を追加する

列を追加する最も簡単な方法は、直接代入することです。df['new_col'] = values のように記述します。右辺には、スカラー値(すべての行にブロードキャストされます)、同じ長さのリスト、NumPy配列、Pandas Series(インデックスに基づいて位置が合わせられます)、または既存の列を使った計算式を指定できます。新しい列はDataFrameの右端に追加されます。

import pandas as pd

df = pd.DataFrame({'price': [10.0, 20.0, 15.0], 'qty': [3, 5, 2]})
df['revenue'] = df['price'] * df['qty']
df['currency'] = 'USD'
print(df)

特徴量エンジニアリング:計算列

DataFrameで最も一般的な操作の一つは、既存の列から派生特徴量を作成することです。累積値、比率、フラグの計算や、カテゴリ値のエンコードを、1つのベクトル化された式で行えます。元の列が変わった場合でも再計算すれば計算列が自動的に更新されるため、特徴量エンジニアリングのパイプラインを簡単に再現できます。

import pandas as pd

df = pd.DataFrame({'salary': [50000, 80000, 60000],
                   'bonus': [5000, 12000, 7000]})
df['total_comp'] = df['salary'] + df['bonus']
df['bonus_pct'] = (df['bonus'] / df['salary'] * 100).round(1)
print(df)

メソッドチェーンで assign() を使う

df.assign(new_col=expression) は、元のDataFrameを変更せずに、列を追加した新しいDataFrameを返します。直接代入とは異なり、メソッドチェーンに自然に組み込めます。1回の呼び出しで複数の列を追加でき、同じ assign() 呼び出し内で先に定義した列を、ラムダ関数を使って後の列の式から参照することもできます。

import pandas as pd

df = pd.DataFrame({'x': [1, 2, 3], 'y': [4, 5, 6]})
result = (df
    .assign(sum_xy=lambda d: d['x'] + d['y'])
    .assign(ratio=lambda d: d['x'] / d['sum_xy'])
)
print(result)

rename() で列名を変更する

df.rename(columns={'old': 'new'}) は、列名を変更した新しいDataFrameを返します。辞書を渡すと、他の列に影響を与えずに指定した列だけを変更できます。関数を使って変更することもできます。たとえば df.rename(columns=str.upper) は、すべての列名を大文字にします。異なるデータソースのDataFrameをマージする前には、キー列が一致するように必ず列名を変更してください。

import pandas as pd

df = pd.DataFrame({'a': [1, 2], 'b': [3, 4], 'c': [5, 6]})
renamed = df.rename(columns={'a': 'alpha', 'b': 'beta'})
print(renamed.columns.tolist())   # ['alpha', 'beta', 'c']

# Rename all columns to uppercase
print(df.rename(columns=str.upper).columns.tolist())  # ['A', 'B', 'C']

列名を整える

実際のデータでは、列名にスペースや特殊文字が含まれていたり、大文字と小文字の使い方が統一されていなかったりすることがよくあります。一般的な前処理として、空白を削除し、小文字に変換し、スペースをアンダースコアに置き換えて正規化します。これによりドット記法で列にアクセスでき、SQL形式のクエリ文字列で引用符に関する問題が起きるのを防げます。

import pandas as pd

df = pd.DataFrame(columns=['First Name', 'Last Name', 'Email Address'])
df.columns = (df.columns
    .str.strip()
    .str.lower()
    .str.replace(' ', '_', regex=False)
)
print(df.columns.tolist())  # ['first_name', 'last_name', 'email_address']

指定した位置に列を挿入する

df.insert(loc, column, value) は、整数位置 loc に列を挿入し、他の列を右に移動します。新しい列を末尾ではなく関連する列の隣に配置したい場合に便利です。assign() とは異なり、DataFrameをその場で変更します。

import pandas as pd

df = pd.DataFrame({'name': ['A', 'B'], 'score': [80, 90]})
df.insert(1, 'grade', ['B', 'A'])
print(df)
#   name grade  score
# 0    A     B     80
# 1    B     A     90

drop() で列を削除する

df.drop(columns=['col1', 'col2']) は、指定した列を除いた新しいDataFrameを返します。古い構文である df.drop(['col1', 'col2'], axis=1) も使用できますが、可読性は劣ります。その場で削除するには inplace=True を渡します。比較やロールバックに備えて元のDataFrameを保持できるよう、パイプラインでは新しいDataFrameを返す方法を常に優先してください。

import pandas as pd

df = pd.DataFrame({'a': [1,2], 'b': [3,4], 'c': [5,6], 'd': [7,8]})
cleaned = df.drop(columns=['b', 'd'])
print(cleaned.columns.tolist())  # ['a', 'c']

drop() で行を削除する

df.drop(index=['r1', 'r2']) は、ラベルを指定して行を削除します。df.drop([0, 2]) は、デフォルトの整数インデックスから行0と行2を削除します。行の削除は、データクリーニング後に既知の不正レコード、外れ値、テスト用の行を取り除くためによく使われます。条件に基づいて削除する場合は、コードの可読性を保つためにブールインデックスを優先してください。

import pandas as pd

df = pd.DataFrame({'x': [10, 20, 30, 40]}, index=['a', 'b', 'c', 'd'])
trimmed = df.drop(index=['b', 'd'])
print(trimmed)
#     x
# a  10
# c  30

pop() で列を削除して返す

df.pop('col') は、DataFrameから列をその場で削除し、Seriesとして返します。特徴量行列から目的列(ラベル)を取り出す場合に便利です。DataFrameから目的列を削除して別に保持し、モデルの y 変数として使用できます。

import pandas as pd

df = pd.DataFrame({'feature1': [1,2], 'feature2': [3,4], 'target': [0,1]})
y = df.pop('target')   # removes column and returns as Series
X = df                 # remaining features
print(y.tolist())      # [0, 1]
print(X.columns.tolist())  # ['feature1', 'feature2']

列の順序を変更する

列の順序を変更するには、df[['col3', 'col1', 'col2']] のように、希望する順序で列を選択します。大きなDataFrameで一部の列だけを移動したい場合は、目的の順序をプログラムで計算します。優先する列を先頭に移動し、残りの列を後に続けます。これはExcelに出力する前によく行うレポート作成手順です。

import pandas as pd

df = pd.DataFrame({'id': [1,2], 'score': [80,90], 'name': ['A','B']})
# Move 'name' and 'id' to front
cols = ['name', 'id'] + [c for c in df.columns if c not in ['name', 'id']]
df = df[cols]
print(df.columns.tolist())  # ['name', 'id', 'score']

既存の列の値を更新する

既存の列のすべての値を更新するには、新しい列を追加するときと同じ代入構文を使います。df['col'] = new_values のように記述します。条件に一致する行だけを更新するには、df.loc[mask, 'col'] = value を使います。更新に連鎖インデックスは決して使わず、SettingWithCopyWarningを避けるために必ず .loc を使ってください。

import pandas as pd

df = pd.DataFrame({'name': ['Alice', 'Bob', 'Carol'], 'score': [45, 80, 92]})
# Set scores below 50 to 50 (floor)
df.loc[df['score'] < 50, 'score'] = 50
print(df['score'].tolist())  # [50, 80, 92]

理解度チェック

このレッスンで学んだ列の追加と削除について、理解度を確認しましょう。

レッスンのまとめ

このレッスンでは、新しい列は代入またはメソッドチェーンに適した assign() で追加すること、rename() はデータを変更せずに列名を変更すること、そしてdrop() は列や行を削除し、デフォルトでは新しいDataFrameを返すことを学びました。次は head()、tail()、info()、describe() を使って、任意のDataFrameをすばやく把握します。

よくある質問

「列の追加と削除」レッスンは無料ですか?

はい。「列の追加と削除」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Pandas & NumPy Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Pandas & NumPy Academyコースには全4レッスンが含まれています。

「列の追加と削除」で何を学びますか?

計算結果から新しい列を追加し、既存の列名を変更し、drop()で不要な列や行を削除します。 ブラウザで直接実行するハンズオンコードでPandas & NumPy Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Pandas & NumPy Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPandas & NumPy Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「列の追加と削除」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPandas & NumPy Academyレッスンでコードを書いて実行できますか?

はい。すべてのPandas & NumPy Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. DataFrameの作成
  2. 列と行の選択
  3. 列の追加と削除
  4. DataFrameの基本的な確認
← Pandas & NumPy Academyに戻る