以下の内容はhttps://uepon.hatenadiary.com/entry/2025/10/13/231625より取得しました。


自分用pandasを使うためのチートシート

最近、pandasを使うことが増えてきたので、自分用にチートシート作成します🫡

pandasは、プログラミング言語Pythonにおいて、データ解析を支援する機能を提供するライブラリである。特に、数表および時系列データを操作するためのデータ構造と演算を提供する。PandasはBSDライセンスのもとで提供されている。Wikipediaより引用

公式サイト

pandas.pydata.org

公式のチートシート

本家のチートシート

0. インストール

pandasのインストールを行うとnumpyも依存関係でインストールされる。 また、Excelの機能を使用するにはopenpyxlをインストールするとよい。

# pip環境であれば
$ python3 -m vnenv .venv
$ source .venv/bin/activate
$ pip install pandas openpyxl

# uv環境であれば
$ uv venv
$ source .venv/bin/activate
$ uv pip install pandas openpyxl

1. データ読み込みと確認

1.1. 基本的な読み込み

import pandas as pd
import numpy as np

# CSV読み込み
df = pd.read_csv('data.csv', encoding='utf-8-sig')
df = pd.read_csv('data.csv', usecols=['col1', 'col2'])  # 特定列のみ
df = pd.read_csv('data.csv', parse_dates=['date_column'])  # 日付列パース

# Excel読み込み
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')
df = pd.read_excel('data.xlsx', sheet_name=0)  # インデックス指定

1.2 DataFrame内のデータ確認

df.shape               # (行数, 列数)
df.info()              # データ型、欠損値確認
df.describe()          # 統計量
df.head(10)            # 最初の10行
df.sample(5)           # ランダムに5行
df.dtypes             # 各列のデータ型

2. データクリーニング

2.1. 欠損している値の処理

# 欠損値の確認
df.isnull().sum()                      # 列ごとの欠損数
df.isnull().sum() / len(df) * 100      # 欠損率(%)

# 欠損値の削除
df.dropna()                             # 欠損値を含む行を削除
df.dropna(subset=['col1', 'col2'])     # 特定列の欠損のみ削除

# 欠損値の補完
df.fillna(0)                           # 0で埋める
df.fillna(df.mean())                   # 平均値で埋める
df.fillna({'col1': 0, 'col2': 'Unknown'})  # 列ごとに異なる値
df.ffill()                             # 前の値で埋める
df.bfill()                             # 後ろの値で埋める

2.2. データ型変換

# 数値変換(エラーは欠損値に)
df['col'] = pd.to_numeric(df['col'], errors='coerce')

# カテゴリ型(メモリ節約)
df['category'] = df['category'].astype('category')

# 文字列変換
df['id'] = df['id'].astype(str)
df['id'] = df['id'].astype(str).str.zfill(5)  # 5桁ゼロ埋め

3. 文字列操作

3.1 基本的な文字列処理

# 大文字・小文字変換
df['text'] = df['text'].str.lower()
df['text'] = df['text'].str.upper()

# 前後の空白削除
df['text'] = df['text'].str.strip()

# 文字列の抽出
df['first_5'] = df['text'].str[:5]     # 最初の5文字
df['last_3'] = df['text'].str[-3:]     # 最後の3文字

# 文字列の分割
df[['first', 'last']] = df['name'].str.split(' ', expand=True)

# 置換
df['text'] = df['text'].str.replace('old', 'new', regex=False)
df['text'] = df['text'].str.replace(r'\d+', '', regex=True)  # 正規表現

# 含む・含まないで絞り込み
df[df['text'].str.contains('keyword', na=False)]
df[df['text'].str.startswith('A', na=False)]
df[df['text'].str.endswith('son', na=False)]

# 正規表現での抽出
df['number'] = df['text'].str.extract(r'(\d+)')  # 数字を抽出

4. 日付操作

4.1. 日付変換と要素の抽出

# 日付型に変換
df['date'] = pd.to_datetime(df['date'])
df['date'] = pd.to_datetime(df['date'], format='%Y/%m/%d')

# 日付から要素を取得
df['year'] = df['date'].dt.year
df['month'] = df['date'].dt.month
df['day'] = df['date'].dt.day
df['dayofweek'] = df['date'].dt.dayofweek     # 0=月曜
df['weekday'] = df['date'].dt.day_name()       # 曜日名
df['quarter'] = df['date'].dt.quarter          # 四半期

4.2. 日付計算

# 日付の加減算
df['next_week'] = df['date'] + pd.Timedelta(days=7)
df['last_month'] = df['date'] - pd.DateOffset(months=1)
df['next_year'] = df['date'] + pd.DateOffset(years=1)

# 期間計算
df['days_diff'] = (df['end_date'] - df['start_date']).dt.days

# 月初・月末
df['month_start'] = df['date'] - pd.offsets.MonthBegin(1)
df['month_end'] = df['date'] + pd.offsets.MonthEnd(0)

5. 列操作と集計

5.1. 列の作成と変更

# 新しい列を作成
df['new_col'] = df['col1'] + df['col2']
df['ratio'] = df['numerator'] / df['denominator']

# 条件分岐で列作成
df['category'] = np.where(df['score'] >= 80, 'A', 'B')

# 複数条件
conditions = [
    df['score'] >= 80,
    df['score'] >= 60,
    df['score'] >= 40
]
choices = ['A', 'B', 'C']
df['grade'] = np.select(conditions, choices, default='D')

# 列名の変更
df.rename(columns={'old_name': 'new_name'}, inplace=True)

# 列の削除
df = df.drop(columns=['col1', 'col2'])

5.2. 基本集計

# 基本統計量
df['col'].sum()
df['col'].mean()
df['col'].median()
df['col'].count()
df['col'].nunique()     # ユニーク値の数

# 複数列の集計
df[['col1', 'col2']].sum()
df[['col1', 'col2']].describe()

# グループ集計
df.groupby('category')['value'].sum()
df.groupby('category')['value'].mean()

# 複数の集計を同時に
df.groupby('category').agg({
    'sales': 'sum',
    'quantity': 'mean',
    'customer_id': 'nunique'
})

6. データ結合

6.1. 横方向の結合(マージ)

# 左結合(最もよく使用)
merged = pd.merge(df1, df2, on='key', how='left')

# 内部結合(両方に存在するキーのみ)
merged = pd.merge(df1, df2, on='key', how='inner')

# 異なる列名でマージ
merged = pd.merge(df1, df2, left_on='id1', right_on='id2')

# 複数キーでマージ
merged = pd.merge(df1, df2, on=['key1', 'key2'])

6.2. 縦方向の結合

# 縦に連結(行を追加)
concatenated = pd.concat([df1, df2], ignore_index=True)

# 横に連結(列を追加)
concatenated = pd.concat([df1, df2], axis=1)

7. フィルタリングと並び替え

7.1. 条件抽出

# 単一条件
df[df['value'] > 100]
df[df['category'] == 'A']

# 複数条件(AND)
df[(df['value'] > 100) & (df['category'] == 'A')]

# 複数条件(OR)
df[(df['value'] > 100) | (df['category'] == 'A')]

# NOT条件
df[~(df['category'] == 'A')]

# リスト内の値
df[df['category'].isin(['A', 'B', 'C'])]

# 範囲指定
df[df['value'].between(100, 200)]

# queryメソッド(可読性が高い)
df.query('value > 100 and category == "A"')
threshold = 150
df.query('value > @threshold')  # 変数使用

7.2. 並び替え

# 昇順ソート
df.sort_values('value')

# 降順ソート
df.sort_values('value', ascending=False)

# 複数列でソート
df.sort_values(['category', 'value'], ascending=[True, False])

# インデックスをリセット
df.sort_values('value').reset_index(drop=True)

8. データ出力

8.1. CSVファイルへの出力

# 基本的な出力
df.to_csv('output.csv', index=False)
df.to_csv('output.csv', index=False, encoding='utf-8-sig')  # 日本語対応

# 特定の列だけ出力
df[['col1', 'col2', 'col3']].to_csv('output.csv', index=False)

8.2. Excelファイル(.xslx)への出力

# 単一シート
df.to_excel('output.xlsx', sheet_name='Sheet1', index=False)

# 複数シート
with pd.ExcelWriter('output.xlsx') as writer:
    df1.to_excel(writer, sheet_name='Data1', index=False)
    df2.to_excel(writer, sheet_name='Data2', index=False)
    
# 既存ファイルに追記
with pd.ExcelWriter('output.xlsx', mode='a') as writer:
    df.to_excel(writer, sheet_name='NewSheet', index=False)

9. よく使うパターン集

9.1. 日付でグループ化して集計

# 月ごとの売上集計
df['month'] = df['date'].dt.to_period('M')
monthly_sales = df.groupby('month')['sales'].sum()

# 曜日ごとの平均
df['weekday'] = df['date'].dt.dayofweek
weekday_avg = df.groupby('weekday')['value'].mean()

9.2. 文字列のクリーニング

# 複数の処理を連続適用
df['text_clean'] = (df['text']
    .str.strip()                    # 前後の空白削除
    .str.lower()                    # 小文字化
    .str.replace(r'[^\w\s]', '', regex=True)  # 記号削除
)

9.3. 条件付き集計

# 条件に合う行数をカウント
count = (df['value'] > 100).sum()

# カテゴリごとの条件カウント
df.groupby('category').apply(lambda x: (x['value'] > 100).sum())

10. ポイント

  1. 欠損値対策 ... na=Falseを文字列操作で使う
  2. 日付変換 ... 最初にpd.to_datetime()で変換
  3. メモリ節約 ... カテゴリ型を活用
  4. 可読性 ... query()メソッドで条件を見やすく
  5. Excel出力 ... ExcelWriterで複数シート対応
  6. エンコーディング ... 日本語はutf-8-sigを使用

おまけサンプル

pandasチートシート テストプログラム ソースコード




以上の内容はhttps://uepon.hatenadiary.com/entry/2025/10/13/231625より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14