mcpField
P
pandas-pro

pandas-pro

github.com/farmageデータ・データベース223283 回インストール5 週間前に更新
リポジトリ

pandas-pro について

データ処理や分析のワークフローを構築する開発者向けの pandas スキルです。ベクトル化処理、結果検証、メモリを考慮した実装を重視します。

主な機能

  1. 01ベクトル化されたDataFrame変換
  2. 02データクリーニングと欠損値処理
  3. 03グループ化、結合、リサンプリング
  4. 04データ品質の検証
  5. 05メモリと性能の最適化

活用シーン

  1. 01表形式データのクリーニングと整形
  2. 02キー検証を伴うデータセットの結合
  3. 03大規模なDataFrame処理の最適化

インストール

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

$npx skills add https://github.com/farmage/opencode-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、形状)

ドキュメント

コメント