概要(DataFrameは「行と列の表」をコードで扱うための基本型)
pandas.DataFrameは、Excelのような表(行・列)をPythonで扱うための中心データ構造です。列名(カラム)と行ラベル(インデックス)を持ち、列単位・行単位・条件での抽出、列の追加・削除、集計や並べ替えなどが数行で書けます。初心者は「作る→見る→選ぶ→変える→集計する」の流れを覚え、インデックスと列名を意識すると迷いません。
作成と確認(最初の5分で掴む基本)
辞書やリストから作成して中身を見る
import pandas as pd
data = {"name": ["Alice", "Bob", "Cathy"], "age": [25, 30, 22], "city": ["Tokyo", "Osaka", "Nagoya"]}
df = pd.DataFrame(data)
print(df.head()) # 先頭5行を確認
print(df.shape) # (行数, 列数)
print(df.columns) # 列名一覧
print(df.dtypes) # 各列の型
Python「行と列の形を確認する→列名と型を確認する」を最初にやる習慣が、その後の誤りを減らします。
インデックス(行ラベル)と列名の設定・変更
df = df.set_index("name", drop=False) # name列をインデックスに(検索や結合が楽になる)
df = df.rename(columns={"city": "pref"}) # 列名変更
Python「検索の軸になる列」をインデックスにすると、行アクセスが直感的になります。
抽出とフィルタ(欲しいデータだけに素早く絞る)
列や行の選択、条件での絞り込み
# 列選択
print(df["age"]) # 1列(Series)
print(df[["name", "age"]]) # 複数列(DataFrame)
# 条件抽出(フィルタ)
adults = df[df["age"] >= 25]
tokyo = df[df["city"] == "Tokyo"]
# loc/iloc(ラベルで、番号で)
print(df.loc["Alice"]) # インデックスが "Alice" の行
print(df.iloc[0]) # 先頭行
Python「列は名前、行はインデックスで取る」が基本。番号で取りたいときは iloc、名前で取りたいときは loc を使います。
並べ替えと重複除去
df_sorted = df.sort_values(by=["age"], ascending=False) # 年齢降順
df_nodup = df.drop_duplicates(subset=["name"]) # name重複を除去
Python順序が重要な処理の前に sort_values、データ整形の前に drop_duplicates を入れると安定します。
変更と追加(列操作・型変換・欠損処理)
列の追加・更新・削除
df["age_plus"] = df["age"] + 1 # 新列追加
df["tag"] = "user" # 全行に同じ値
df["name"] = df["name"].str.strip() # 文字列整形
df = df.drop(columns=["age_plus"]) # 列削除
Python新しい列は「既存列から計算する」か「定数を入れる」。削除は drop(columns=…) が安全です。
型変換と欠損値の扱い
df["age"] = df["age"].astype("int64") # 型を明示
df["score"] = pd.to_numeric(df["score"], errors="coerce") # 不正値をNaNに
df["age"] = df["age"].fillna(0) # 欠損補完
df = df.dropna(subset=["city"]) # cityが欠損の行を落とす
Python「読んだ直後に型と欠損を整える」ことで、後工程のバグが激減します。
集計とグループ化(数値をまとめて意味に変える)
基本統計とグループ集計
print(df.describe()) # 数値列の要約(平均、分散など)
by_city = df.groupby("city")["age"].mean() # 都市ごとの平均年齢
counts = df["city"].value_counts() # 都市の件数
Pythongroupby で「単位(カテゴリ)ごと」に集計するのが定石。value_counts は「頻度分布」を即座に出せます。
複数列の集計やピボット
agg = df.groupby("city").agg({"age": ["mean", "max"], "score": "sum"})
pivot = df.pivot_table(index="city", values="score", aggfunc="mean")
Pythonagg/pivot_table は「一度に複数の指標」を整えたいときに便利です。
結合・整形・大量データ(現場でよく使う型)
DataFrameの結合(縦に足す、横に揃える)
import pandas as pd
a = pd.DataFrame({"id": [1,2], "val": [10, 20]})
b = pd.DataFrame({"id": [2,3], "val": [30, 40]})
# 縦結合(行を足す)
cat = pd.concat([a, b], ignore_index=True)
# 横結合(キーで揃える)
users = pd.DataFrame({"id": [1,2,3], "name": ["A","B","C"]})
merged = a.merge(users, on="id", how="left")
Pythonconcat は「同じ列を縦に伸ばす」、merge は「キーで情報を横に揃える」。役割の違いを掴みましょう。
大規模データの勘所(高速・省メモリ)
大量データでは「必要な列だけ使う」「型を事前に決める」「処理を段階化して“作らず流す”」が効きます。read_csv の usecols/dtype、chunksize と合わせると安定します。
例題で身につける(定番から一歩先まで)
例題1:読み→クリーニング→フィルタ→集計
import pandas as pd
df = pd.DataFrame({"name": [" Alice ", "Bob", "Cathy"], "age": [25, 30, 22], "city": ["Tokyo", "Osaka", "Tokyo"]})
df["name"] = df["name"].str.strip()
tokyo = df[df["city"] == "Tokyo"]
print(tokyo["age"].mean()) # Tokyoの平均年齢
Python例題2:条件列の追加と並べ替え
import pandas as pd
df = pd.DataFrame({"item": ["coffee", "tea", "sugar"], "price": [350, 280, 120]})
df["expensive"] = df["price"] >= 300
print(df.sort_values(by=["price"], ascending=False))
Python例題3:重複除去とグループ集計
import pandas as pd
df = pd.DataFrame({"user": ["A","A","B","C","C"], "score": [10,10,20,30,30]})
df = df.drop_duplicates() # 全列重複を削除
print(df.groupby("user")["score"].sum()) # ユーザー別合計
Python例題4:横結合でマスタ情報を付与
import pandas as pd
sales = pd.DataFrame({"id": [101,102,103], "amount": [1200, 800, 500]})
users = pd.DataFrame({"id": [101,102,103], "name": ["Alice","Bob","Cathy"]})
out = sales.merge(users, on="id", how="left")
print(out)
Pythonまとめ
DataFrameの核は「列名で考える、インデックスで行を捉える」。最初に形(head/shape/columns/dtypes)を確認し、抽出は列名・条件・loc/ilocを使い分ける。列の追加・削除・型変換・欠損処理を“読み直後”に済ませると、以降がスムーズ。集計は groupby/agg、結合は concat/merge を用途で選ぶ。大量データは必要列・型固定・段階処理で“作らず流す”。この型さえ身につければ、初心者でも短く、読みやすく、壊れないデータ加工を自信を持って書けるようになります。
