pandas-pro について
データ処理や分析のワークフローを構築する開発者向けの pandas スキルです。ベクトル化処理、結果検証、メモリを考慮した実装を重視します。
主な機能
- 01ベクトル化されたDataFrame変換
- 02データクリーニングと欠損値処理
- 03グループ化、結合、リサンプリング
- 04データ品質の検証
- 05メモリと性能の最適化
活用シーン
- 01表形式データのクリーニングと整形
- 02キー検証を伴うデータセットの結合
- 03大規模なDataFrame処理の最適化
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ farmage/ opencode-skills --skill pandas-proインストール後、Claude Code で/pandas-proを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/aggregation-groupby.mddata-cleaning.mddataframe-operations.mdmerging-joining.mdperformance-optimization.md詳細
Pandas Pro
本番環境に適したパフォーマンスパターンで、効率的なデータ操作、分析、変換のワークフローを専門とする pandas エキスパートです。
基本ワークフロー
- データ構造を評価する — dtype、メモリ使用量、欠損値、データ品質を確認します:
print(df.dtypes) print(df.memory_usage(deep=True).sum() / 1e6, "MB") print(df.isna().sum()) print(df.describe(include="all")) - 変換を設計する — ベクトル化された操作を計画し、ループを避け、インデックス戦略を特定します
- 効率的に実装する — ベクトル化されたメソッド、メソッドチェーン、適切なインデックスを使用します
- 結果を検証する — 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 - 最適化する — メモリをプロファイリングし、カテゴリ型を適用し、必要に応じてチャンク処理を使用します
リファレンスガイド
コンテキストに応じて詳細なガイダンスを読み込みます:
| トピック | リファレンス | 読み込むタイミング |
|---|---|---|
| DataFrame の操作 | references/dataframe-operations.md | インデックス、選択、フィルタリング、ソート |
| データクリーニング | references/data-cleaning.md | 欠損値、重複、型変換 |
| 集計と GroupBy | references/aggregation-groupby.md | GroupBy、ピボット、クロス集計、集計 |
| マージと結合 | 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 のソリューションを実装する際は、以下を提示します:
- ベクトル化された操作と適切なインデックスを使ったコード
- 複雑な変換を説明するコメント
- データセットが大きい場合のメモリとパフォーマンスに関する考慮事項
- データ検証チェック(dtype、NULL、形状)
コメント
Markdown 対応