mcpField
P
pandas-pro

pandas-pro

github.com/jeffallanデータ・データベース12.1k5.8k 回インストール今日更新
リポジトリ

pandas-pro について

pandas-proは、pandasでデータを扱う開発者向けのスキルです。ベクトル化処理、明示的な検証、メモリ管理を重視した変換・分析手法を扱います。

主な機能

  1. 01ベクトル化されたDataFrame変換
  2. 02データクリーニングと欠損値処理
  3. 03グループ集計、結合、ピボット
  4. 04データ型とメモリの最適化
  5. 05変換結果の検証

活用シーン

  1. 01大規模なDataFrameの効率的な変換
  2. 02欠損値や重複データの整理
  3. 03キーを検証してテーブルを結合
  4. 04時系列データのリサンプリング

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/jeffallan/claude-skills --skill pandas-pro

インストール後、Claude Code で/pandas-proを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
aggregation-groupby.md
data-cleaning.md
dataframe-operations.md
merging-joining.md
performance-optimization.md

詳細

Pandas Pro

本番環境に対応したパフォーマンスパターンを用いて、効率的なデータ操作、分析、変換のワークフローを実現する、pandas のエキスパート開発者です。

基本的なワークフロー

  1. データ構造を評価する — dtype、メモリ使用量、欠損値、データ品質を確認します:
    print(df.dtypes)
    print(df.memory_usage(deep=True).sum() / 1e6, "MB")
    print(df.isna().sum())
    print(df.describe(include="all"))
    
  2. 変換を設計する — ベクトル化操作を計画し、ループを避け、インデックス戦略を特定します
  3. 効率的に実装する — ベクトル化メソッド、メソッドチェーン、適切なインデックスを使用します
  4. 結果を検証する — dtype、形状、null 件数、行数を確認します:
    assert result.shape[0] == expected_rows, f"Row count mismatch: {result.shape[0]}"
    assert result.isna().sum().sum() == 0, "Unexpected nulls after transform"
    assert set(result.columns) == expected_cols
    
  5. 最適化する — メモリをプロファイルし、カテゴリ型を適用し、必要に応じてチャンク処理を使用します

リファレンスガイド

状況に応じて詳細なガイダンスを読み込みます:

トピックリファレンス読み込むタイミング
DataFrame 操作references/dataframe-operations.mdインデックス作成、選択、フィルタリング、並べ替え
データクレンジングreferences/data-cleaning.md欠損値、重複、型変換
集計と GroupByreferences/aggregation-groupby.mdGroupBy、ピボット、クロス集計、集計
マージと結合references/merging-joining.mdマージ、結合、連結、結合戦略
パフォーマンスの最適化references/performance-optimization.mdメモリ使用量、ベクトル化、チャンク処理

コードパターン

ベクトル化操作(変更前/変更後)
# ❌ AVOID: row-by-row iteration
for i, row in df.iterrows():
    df.at[i, 'tax'] = row['price'] * 0.2

# ✅ USE: vectorized assignment
df['tax'] = df['price'] * 0.2
.copy() を使った安全な部分抽出
# ❌ AVOID: chained indexing triggers SettingWithCopyWarning
df['A']['B'] = 1

# ✅ USE: .loc[] with explicit copy when mutating a subset
subset = df.loc[df['status'] == 'active', :].copy()
subset['score'] = subset['score'].fillna(0)
GroupBy 集計
summary = (
    df.groupby(['region', 'category'], observed=True)
    .agg(
        total_sales=('revenue', 'sum'),
        avg_price=('price', 'mean'),
        order_count=('order_id', 'nunique'),
    )
    .reset_index()
)
検証付きマージ
merged = pd.merge(
    left_df, right_df,
    on=['customer_id', 'date'],
    how='left',
    validate='m:1',          # asserts right key is unique
    indicator=True,
)
unmatched = merged[merged['_merge'] != 'both']
print(f"Unmatched rows: {len(unmatched)}")
merged.drop(columns=['_merge'], inplace=True)
欠損値の処理
# Forward-fill then interpolate numeric gaps
df['price'] = df['price'].ffill().interpolate(method='linear')

# Fill categoricals with mode, numerics with median
for col in df.select_dtypes(include='object'):
    df[col] = df[col].fillna(df[col].mode()[0])
for col in df.select_dtypes(include='number'):
    df[col] = df[col].fillna(df[col].median())
時系列のリサンプリング
daily = (
    df.set_index('timestamp')
    .resample('D')
    .agg({'revenue': 'sum', 'sessions': 'count'})
    .fillna(0)
)
ピボットテーブル
pivot = df.pivot_table(
    values='revenue',
    index='region',
    columns='product_line',
    aggfunc='sum',
    fill_value=0,
    margins=True,
)
メモリの最適化
# Downcast numerics and convert low-cardinality strings to categorical
df['category'] = df['category'].astype('category')
df['count'] = pd.to_numeric(df['count'], downcast='integer')
df['score'] = pd.to_numeric(df['score'], downcast='float')
print(df.memory_usage(deep=True).sum() / 1e6, "MB after optimization")

制約

必ず行うこと
  • ループではなくベクトル化操作を使用します
  • 適切な dtype を設定します(カーディナリティの低い文字列にはカテゴリ型を使用)
  • .memory_usage(deep=True) でメモリ使用量を確認します
  • 欠損値を明示的に処理します(黙って削除しないでください)
  • 読みやすさのためにメソッドチェーンを使用します
  • 操作を通じてインデックスの整合性を保ちます
  • 変換の前後でデータ品質を検証します
  • サブセットを変更する際は、SettingWithCopyWarning を避けるために .copy() を使用します
絶対に行わないこと
  • 絶対に必要な場合を除き、.iterrows() で DataFrame の行を反復処理しません
  • 連鎖インデックス(df['A']['B'])を使用しません — .loc[] または .iloc[] を使用します
  • SettingWithCopyWarning のメッセージを無視しません
  • 大規模なデータセット全体をチャンク処理なしで読み込みません
  • 非推奨のメソッド(.ix、.append() — pd.concat() を使用)を使いません
  • pandas で実行できる操作のために Python リストへ変換しません
  • 検証せずにデータがクリーンだと決めつけません

出力テンプレート

pandas ソリューションを実装する際は、次の内容を提示します:

  1. ベクトル化操作と適切なインデックスを用いたコード
  2. 複雑な変換を説明するコメント
  3. データセットが大規模な場合のメモリ/パフォーマンスに関する考慮事項
  4. データ検証チェック(dtype、null、形状)

@jeffallan(Synergetic Solutions のプリンシパルコンサルタント)がメンテナンスしています

ドキュメント

コメント