【完全入門】PythonのpandasでDataFrameを自在に扱う方法|基本構文から実践例まで解説!

python

Pythonでデータ分析をするなら、まず覚えるべきライブラリがpandas(パンダス)です。

pandasの中心的なデータ構造であるDataFrame(データフレーム)は、表形式のデータを効率よく操作するための道具です。

DataFrameでできること:

  • CSVやExcelファイルの読み書き
  • データの集計や加工
  • 条件に合ったデータの抽出
  • グラフ作成のためのデータ準備

実務で必須の処理がたった数行のコードで実現できます

この記事では、pandasの基本からDataFrameの実践的な使い方まで、初心者にも分かりやすく解説していきます。

スポンサーリンク

第1章:pandasの導入とDataFrameの作成方法

pandasのインストール(初回のみ)

pip install pandas

DataFrameを作成する方法

辞書から作成(基本的な方法):

import pandas as pd

# データを辞書形式で準備
data = {
    "名前": ["田中", "佐藤", "鈴木"],
    "年齢": [25, 30, 22],
    "職業": ["エンジニア", "デザイナー", "営業"]
}

# DataFrameを作成
df = pd.DataFrame(data)
print(df)

出力結果:

   名前  年齢     職業
0  田中  25  エンジニア
1  佐藤  30  デザイナー
2  鈴木  22     営業

リストのリストから作成:

# 2次元リストでも作成可能
data_list = [
    ["田中", 25, "エンジニア"],
    ["佐藤", 30, "デザイナー"],
    ["鈴木", 22, "営業"]
]

df = pd.DataFrame(data_list, columns=["名前", "年齢", "職業"])

空のDataFrameを作成:

# 後からデータを追加する場合
df = pd.DataFrame(columns=["名前", "年齢", "職業"])

第2章:CSVファイルとの読み書き

CSVファイルの読み込み

# 基本的な読み込み
df = pd.read_csv("data.csv")

# 文字化け対策(日本語の場合)
df = pd.read_csv("data.csv", encoding="utf-8")

# 先頭行をカラム名にしない場合
df = pd.read_csv("data.csv", header=None)

CSVファイルへの書き出し

# 基本的な書き出し
df.to_csv("output.csv", index=False)

# 文字化け対策
df.to_csv("output.csv", index=False, encoding="utf-8")

重要なオプション:

  • index=False:行番号(インデックス)を出力しない
  • encoding="utf-8":日本語の文字化けを防ぐ

Excelファイルとの連携

# Excelファイルの読み込み
df = pd.read_excel("data.xlsx")

# Excelファイルに書き出し
df.to_excel("output.xlsx", index=False)

注意: Excelファイルを扱う場合は、追加でライブラリのインストールが必要です:

pip install openpyxl

第3章:DataFrameの基本操作と確認方法

データの概要を確認

# 最初の数行を表示
df.head()      # 先頭5行
df.head(10)    # 先頭10行

# 最後の数行を表示
df.tail()      # 末尾5行

# データの基本情報
df.info()      # 列名、データ型、欠損値の有無など
df.describe()  # 数値列の統計情報(平均、標準偏差など)

# データの形状(行数、列数)
print(df.shape)  # (行数, 列数)

# 列名の確認
print(df.columns)

特定の列を選択

# 1つの列を選択
names = df["名前"]        # Series形式
ages = df["年齢"]

# 複数の列を選択
subset = df[["名前", "職業"]]  # DataFrame形式

# 列の順番を変えて選択
reordered = df[["職業", "名前", "年齢"]]

行の抽出

位置による抽出(iloc):

# 特定の行を選択
first_row = df.iloc[0]        # 0行目
rows_1_to_3 = df.iloc[1:3]    # 1〜2行目(3は含まない)

# 特定の位置の値を取得
value = df.iloc[0, 1]         # 0行目1列目の値

ラベルによる抽出(loc):

# インデックスが数値でない場合に便利
df.loc[0]                     # インデックス0の行
df.loc[0:2]                   # インデックス0〜2の行

条件による抽出(フィルタリング)

# 年齢が25以上の人を抽出
older_people = df[df["年齢"] >= 25]

# 複数条件の組み合わせ
young_engineers = df[(df["年齢"] < 30) & (df["職業"] == "エンジニア")]

# 特定の値を含む行を抽出
engineers = df[df["職業"] == "エンジニア"]

# 複数の値のいずれかに一致する行
tech_people = df[df["職業"].isin(["エンジニア", "デザイナー"])]

第4章:列・行の追加・削除・変更

新しい列を追加

計算結果を新しい列に:

# 年齢に基づいたカテゴリを追加
df["年齢カテゴリ"] = df["年齢"].apply(lambda x: "若手" if x < 30 else "ベテラン")

# 固定値を追加
df["部署"] = "開発部"

# 複数列の計算結果を追加
# 例:年齢 × 経験年数のような計算

条件に基づいた値の設定:

import numpy as np

# 複雑な条件分岐
df["評価"] = np.where(df["年齢"] >= 30, "シニア", 
                     np.where(df["年齢"] >= 25, "ミドル", "ジュニア"))

行の追加

# 新しい行を末尾に追加
new_row = {"名前": "山本", "年齢": 27, "職業": "マーケター"}
df = df.append(new_row, ignore_index=True)

# または、locを使って追加
df.loc[len(df)] = ["山本", 27, "マーケター"]

列・行の削除

列の削除:

# 列を削除(元のDataFrameは変更されない)
df_new = df.drop("年齢カテゴリ", axis=1)

# 元のDataFrameを直接変更
df.drop("年齢カテゴリ", axis=1, inplace=True)

# 複数列を同時に削除
df.drop(["列名1", "列名2"], axis=1, inplace=True)

行の削除:

# 特定のインデックスの行を削除
df.drop(0, axis=0, inplace=True)  # 0行目を削除

# 条件に合う行を削除
df = df[df["年齢"] >= 20]  # 年齢20未満の行を除外

データの変更

# 特定のセルの値を変更
df.loc[0, "年齢"] = 26

# 列全体の値を変更
df["職業"] = df["職業"].replace("エンジニア", "システム開発者")

# 複数の値をまとめて置換
df["職業"] = df["職業"].replace({
    "エンジニア": "システム開発者",
    "デザイナー": "UIデザイナー"
})

第5章:よく使うデータ加工と集計テクニック

グループごとの集計

# 職業ごとの平均年齢
age_by_job = df.groupby("職業")["年齢"].mean()

# 複数の統計値を一度に計算
job_stats = df.groupby("職業")["年齢"].agg(["mean", "min", "max", "count"])

# 複数列での集計
multi_group = df.groupby(["職業", "年齢カテゴリ"]).size()

データの並び替え

# 年齢で昇順ソート
df_sorted = df.sort_values("年齢")

# 年齢で降順ソート
df_sorted = df.sort_values("年齢", ascending=False)

# 複数列でソート
df_sorted = df.sort_values(["職業", "年齢"])

欠損値(NaN)の処理

# 欠損値があるかチェック
print(df.isnull().sum())

# 欠損値がある行を削除
df_clean = df.dropna()

# 欠損値を特定の値で埋める
df_filled = df.fillna("不明")

# 列ごとに異なる値で埋める
df_filled = df.fillna({"名前": "不明", "年齢": 0})

# 前の値で埋める(forward fill)
df_filled = df.fillna(method="ffill")

データの型変換

# 文字列を数値に変換
df["年齢"] = pd.to_numeric(df["年齢"], errors="coerce")

# 日付型に変換
df["入社日"] = pd.to_datetime(df["入社日"])

# カテゴリ型に変換(メモリ効率が良い)
df["職業"] = df["職業"].astype("category")

第6章:実用的な応用例

重複データの処理

# 重複行を確認
duplicates = df.duplicated()

# 重複行を削除
df_unique = df.drop_duplicates()

# 特定の列での重複を削除
df_unique = df.drop_duplicates(subset=["名前"])

データの結合

# 2つのDataFrameを縦に結合
df_combined = pd.concat([df1, df2], ignore_index=True)

# 2つのDataFrameを横に結合
df_merged = pd.merge(df1, df2, on="共通のキー列")

条件に基づく値の変更

# 複雑な条件での値の設定
df.loc[df["年齢"] >= 30, "ステータス"] = "シニア"
df.loc[df["年齢"] < 30, "ステータス"] = "ジュニア"

# 条件に基づく計算
df["年収推定"] = df["年齢"] * 10  # 簡単な例

まとめ:DataFrameを使いこなせば、Pythonでのデータ分析が加速する!

pandasのDataFrameは、表形式データの操作を圧倒的に効率化してくれる強力な道具です。

特に重要な機能:

  • データの読み込み・書き出し:CSV、Excelファイルとの連携
  • 行列の抽出・加工:必要なデータだけを取り出す
  • 条件でのフィルタリング:特定の条件に合うデータを抽出
  • グループ集計や統計処理:データの傾向を把握

よく使う機能の早見表

操作コマンド説明
データ確認df.head()先頭数行を表示
列選択df["列名"]特定の列を抽出
条件抽出df[df["列"] > 値]条件に合う行を抽出
グループ集計df.groupby("列").mean()グループごとの平均
ソートdf.sort_values("列")指定列で並び替え
欠損値削除df.dropna()欠損値がある行を削除

最初は覚えることが多く感じるかもしれませんが、実際にデータを触りながら覚えれば必ず身につきま

コメント

タイトルとURLをコピーしました