Python | ファイル・OS 操作:pandas.DataFrame の基本

Python Python
スポンサーリンク

概要(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()         # 都市の件数
Python

groupby で「単位(カテゴリ)ごと」に集計するのが定石。value_counts は「頻度分布」を即座に出せます。

複数列の集計やピボット

agg = df.groupby("city").agg({"age": ["mean", "max"], "score": "sum"})
pivot = df.pivot_table(index="city", values="score", aggfunc="mean")
Python

agg/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")
Python

concat は「同じ列を縦に伸ばす」、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 を用途で選ぶ。大量データは必要列・型固定・段階処理で“作らず流す”。この型さえ身につければ、初心者でも短く、読みやすく、壊れないデータ加工を自信を持って書けるようになります。

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