データサイエンスの現場では、Pandasが最も重要なツールの一つです。しかし、「あの操作はどうやるんだったっけ?」と迷うことも多いのではないでしょうか。本記事では、Pandas操作を目的別に整理し、実際のコード例とともに解説します。
- Pandasの基本的なデータ抽出方法
- 条件に基づくデータフィルタリング
- データ集計とグループ化の手法
- 複数のDataFrameを結合する方法
- 実践的な使用例とベストプラクティス
1. データ抽出の基本操作
Pandasでデータを扱う際、最初に覚えるべきは基本的なデータ抽出方法です。ここでは、列の選択、行の選択、インデックスアクセスなどの基本操作を確認しましょう。
1.1 列の選択
DataFrameから特定の列を選択する方法は複数あります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import pandas as pd import numpy as np # サンプルデータの作成 df = pd.DataFrame({ 'name': ['田中', '佐藤', '鈴木', '高橋'], 'age': [25, 30, 35, 28], 'salary': [400000, 500000, 600000, 450000], 'department': ['営業', '開発', '営業', '開発'] }) # 単一列の選択 name_series = df['name'] print(name_series) # 複数列の選択 selected_columns = df[['name', 'age']] print(selected_columns) |
1.2 行の選択
行の選択にはloc
とiloc
を使用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# インデックスラベルで行を選択(loc) first_row = df.loc[0] print(first_row) # 複数行の選択 multiple_rows = df.loc[0:2] print(multiple_rows) # 位置インデックスで行を選択(iloc) first_row_iloc = df.iloc[0] print(first_row_iloc) # 最初の2行を選択 first_two_rows = df.iloc[:2] print(first_two_rows) |
メソッド | 説明 | 使用例 |
---|---|---|
df['column'] |
単一列の選択 | df['name'] |
df[['col1', 'col2']] |
複数列の選択 | df[['name', 'age']] |
df.loc[index] |
ラベルベースの行選択 | df.loc[0] |
df.iloc[position] |
位置ベースの行選択 | df.iloc[0] |
2. 条件抽出・フィルタリング
データ分析では、条件に基づくデータフィルタリングが頻繁に必要になります。Pandasでは様々な条件指定方法があります。
2.1 単一条件での抽出
1 2 3 4 5 6 7 8 9 10 11 |
# 年齢が30歳以上の従業員を抽出 age_filter = df[df['age'] >= 30] print(age_filter) # 営業部の従業員を抽出 sales_filter = df[df['department'] == '営業'] print(sales_filter) # 給与が500000以上の従業員を抽出 salary_filter = df[df['salary'] >= 500000] print(salary_filter) |
2.2 複数条件での抽出
複数条件を組み合わせる場合は、&(AND)や|(OR)を使用します。
1 2 3 4 5 6 7 8 9 10 11 |
# AND条件:年齢が30歳以上かつ営業部の従業員 and_filter = df[(df['age'] >= 30) & (df['department'] == '営業')] print(and_filter) # OR条件:年齢が25歳以下または給与が500000以上の従業員 or_filter = df[(df['age'] <= 25) | (df['salary'] >= 500000)] print(or_filter) # NOT条件:営業部以外の従業員 not_filter = df[df['department'] != '営業'] print(not_filter) |
2.3 isin()を使った抽出
1 2 3 4 5 6 7 8 |
# 特定の値のリストに含まれるデータを抽出 specific_names = df[df['name'].isin(['田中', '佐藤'])] print(specific_names) # 特定の部署に属する従業員を抽出 departments = ['営業', '開発'] dept_filter = df[df['department'].isin(departments)] print(dept_filter) |
3. データ集計・グループ化
データ分析において、グループ化と集計は非常に重要な操作です。Pandasのgroupby
機能を使って、効率的にデータを集計できます。
3.1 基本的なグループ化
1 2 3 4 5 6 7 8 9 10 11 |
# 部署別の平均給与を計算 dept_avg_salary = df.groupby('department')['salary'].mean() print(dept_avg_salary) # 部署別の従業員数をカウント dept_count = df.groupby('department').size() print(dept_count) # 部署別の統計情報を表示 dept_stats = df.groupby('department').describe() print(dept_stats) |
3.2 複数の集計関数の適用
1 2 3 4 5 6 7 8 9 10 |
# 部署別に複数の統計量を計算 dept_agg = df.groupby('department')['salary'].agg(['mean', 'min', 'max', 'std']) print(dept_agg) # 複数列に対して異なる集計関数を適用 multi_agg = df.groupby('department').agg({ 'salary': ['mean', 'max'], 'age': ['mean', 'min'] }) print(multi_agg) |
3.3 データの並び替え
1 2 3 4 5 6 7 8 9 10 11 |
# 給与の昇順で並び替え sorted_asc = df.sort_values('salary') print(sorted_asc) # 給与の降順で並び替え sorted_desc = df.sort_values('salary', ascending=False) print(sorted_desc) # 複数列での並び替え multi_sort = df.sort_values(['department', 'salary'], ascending=[True, False]) print(multi_sort) |
集計関数 | 説明 | 使用例 |
---|---|---|
mean() |
平均値 | df.groupby('dept')['salary'].mean() |
sum() |
合計値 | df.groupby('dept')['salary'].sum() |
count() |
非欠損値の数 | df.groupby('dept')['salary'].count() |
size() |
グループのサイズ | df.groupby('dept').size() |
min()/max() |
最小値/最大値 | df.groupby('dept')['salary'].max() |
4. データ結合・マージ
実際のデータ分析では、複数のDataFrameを結合する必要が頻繁に発生します。Pandasではmerge
、join
、concat
などの機能を提供しています。
4.1 merge()を使った結合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# 2つ目のDataFrameを作成 df2 = pd.DataFrame({ 'name': ['田中', '佐藤', '山田', '鈴木'], 'score': [85, 92, 78, 90], 'grade': ['A', 'A', 'B', 'A'] }) # 内部結合(INNER JOIN) inner_merged = pd.merge(df, df2, on='name', how='inner') print(inner_merged) # 左結合(LEFT JOIN) left_merged = pd.merge(df, df2, on='name', how='left') print(left_merged) # 外部結合(OUTER JOIN) outer_merged = pd.merge(df, df2, on='name', how='outer') print(outer_merged) |
4.2 concat()を使った結合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# 縦方向の結合 df3 = pd.DataFrame({ 'name': ['中村', '吉田'], 'age': [32, 29], 'salary': [550000, 480000], 'department': ['開発', '営業'] }) # 縦方向に結合 vertical_concat = pd.concat([df, df3], ignore_index=True) print(vertical_concat) # 横方向の結合 df4 = pd.DataFrame({ 'bonus': [50000, 60000, 70000, 55000], 'evaluation': ['良', '優', '優', '良'] }) horizontal_concat = pd.concat([df, df4], axis=1) print(horizontal_concat) |
4.3 join()を使った結合
1 2 3 4 5 6 7 |
# インデックスベースの結合 df_indexed = df.set_index('name') df2_indexed = df2.set_index('name') # 左結合でインデックスベースの結合 joined_data = df_indexed.join(df2_indexed, how='left') print(joined_data) |
merge()
: 列の値に基づいて結合したい場合join()
: インデックスに基づいて結合したい場合concat()
: 単純に複数のDataFrameを連結したい場合
5. 実践的な使用例
ここでは、実際のデータ分析でよく使われる操作を組み合わせた例を紹介します。
5.1 売上データの分析例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# 売上データの作成 sales_data = pd.DataFrame({ 'date': pd.date_range('2023-01-01', periods=100, freq='D'), 'product': np.random.choice(['A', 'B', 'C'], 100), 'sales': np.random.randint(1000, 10000, 100), 'region': np.random.choice(['北海道', '関東', '関西'], 100) }) # 月別・商品別の売上集計 sales_data['month'] = sales_data['date'].dt.month monthly_product_sales = sales_data.groupby(['month', 'product'])['sales'].sum().reset_index() print(monthly_product_sales) # 地域別の売上上位商品 region_top_products = sales_data.groupby(['region', 'product'])['sales'].sum().reset_index() region_top_products = region_top_products.sort_values(['region', 'sales'], ascending=[True, False]) print(region_top_products) # 条件に基づく抽出と集計 high_sales = sales_data[sales_data['sales'] >= 5000] high_sales_summary = high_sales.groupby('product')['sales'].agg(['count', 'mean', 'sum']) print(high_sales_summary) |
5.2 欠損値の処理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# 欠損値を含むデータの作成 df_with_nan = df.copy() df_with_nan.loc[1, 'salary'] = np.nan df_with_nan.loc[2, 'age'] = np.nan # 欠損値の確認 print(df_with_nan.isnull().sum()) # 欠損値の削除 df_dropped = df_with_nan.dropna() print(df_dropped) # 欠損値の埋め込み df_filled = df_with_nan.fillna({ 'salary': df_with_nan['salary'].mean(), 'age': df_with_nan['age'].median() }) print(df_filled) |
5.3 データの変換とピボットテーブル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# ピボットテーブルの作成 pivot_table = sales_data.pivot_table( values='sales', index='region', columns='product', aggfunc='sum', fill_value=0 ) print(pivot_table) # データの変換 melted_data = pivot_table.reset_index().melt( id_vars=['region'], var_name='product', value_name='total_sales' ) print(melted_data) |
操作 | メソッド | 用途 |
---|---|---|
欠損値確認 | isnull() , isna() |
データの品質チェック |
欠損値削除 | dropna() |
欠損値を含む行/列の削除 |
欠損値埋め込み | fillna() |
欠損値を特定の値で置換 |
ピボットテーブル | pivot_table() |
クロス集計と要約 |
データ変換 | melt() |
ワイド形式からロング形式への変換 |
6. まとめ
本記事では、Pandasの基本的な操作から実践的な使用例まで、目的別に整理して解説しました。
- データ抽出: loc, iloc, 条件フィルタリングを使い分ける
- データ集計: groupby()と各種集計関数を組み合わせる
- データ結合: merge(), join(), concat()を適切に選択する
- 実践応用: 複数の操作を組み合わせて効率的にデータを処理する
これらの操作を組み合わせることで、効率的なデータ分析が可能になります。日々のデータ処理で困った際は、この逆引き辞典を参考にして、適切な手法を選択してください。
Pandasは非常に強力なライブラリですが、基本的な操作をしっかりと理解することで、より高度なデータ分析にも対応できるようになります。継続的な学習と実践を通じて、データサイエンススキルを向上させていきましょう。