最近、pandasを使うことが増えてきたので、自分用にチートシート作成します🫡
pandasは、プログラミング言語Pythonにおいて、データ解析を支援する機能を提供するライブラリである。特に、数表および時系列データを操作するためのデータ構造と演算を提供する。PandasはBSDライセンスのもとで提供されている。Wikipediaより引用
公式サイト
公式のチートシート
- 0. インストール
- 1. データ読み込みと確認
- 2. データクリーニング
- 3. 文字列操作
- 4. 日付操作
- 5. 列操作と集計
- 6. データ結合
- 7. フィルタリングと並び替え
- 8. データ出力
- 9. よく使うパターン集
- 10. ポイント
- おまけサンプル
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. ポイント
- 欠損値対策 ...
na=Falseを文字列操作で使う - 日付変換 ... 最初に
pd.to_datetime()で変換 - メモリ節約 ... カテゴリ型を活用
- 可読性 ...
query()メソッドで条件を見やすく - Excel出力 ...
ExcelWriterで複数シート対応 - エンコーディング ... 日本語は
utf-8-sigを使用