pandas

Pythonデータ分析の必須ライブラリ。DataFrameによる構造化データ操作、CSV/JSON/SQL等の多様なデータソース対応。データクリーニング、変換、集計、可視化の基盤ツール。

Pythonデータ分析データサイエンスDataFrameデータ操作

GitHub概要

pandas-dev/pandas

Flexible and powerful data analysis / manipulation library for Python, providing labeled data structures similar to R data.frame objects, statistical functions, and much more

スター46,002
ウォッチ1,112
フォーク18,687
作成日:2010年8月24日
言語:Python
ライセンス:BSD 3-Clause "New" or "Revised" License

トピックス

alignmentdata-analysisdata-scienceflexiblepandaspython

スター履歴

pandas-dev/pandas Star History
データ取得日時: 2025/7/16 11:10

フレームワーク

Pandas

概要

Pandasは、Pythonのデータ操作・分析ライブラリです。

詳細

Pandas(パンダス)は2008年にWes McKinneyによって開発が始まった、Pythonにおけるデータ操作と分析のための中心的なライブラリです。構造化データの処理、変換、分析における必須ツールとして、データサイエンティストの作業効率を大幅に向上させます。DataFrameとSeriesという主要なデータ構造を提供し、CSV、Excel、JSON、SQLデータベースなど様々なデータソースからの読み込みと書き込みをサポートします。データのクリーニング、フィルタリング、グループ化、集計、結合などの操作を直感的なAPIで実現でき、NumPy、Matplotlib、scikit-learnなど他のPythonライブラリとの連携もシームレスです。ビジネス分析、金融データ分析、研究、機械学習のデータ前処理など幅広い分野で使用され、Pythonデータサイエンスエコシステムの基盤として不動の地位を占めています。

メリット・デメリット

メリット

  • 直感的なAPI: シンプルで理解しやすいデータ操作
  • 豊富なデータソース対応: CSV、Excel、JSON、SQLなど多数のフォーマット
  • 高性能: NumPyベースの効率的な操作
  • 柔軟なデータ構造: DataFrameとSeriesで様々なデータを表現
  • 缠失値処理: NaN値の適切なハンドリング
  • グループ操作: 強力なGroupBy機能
  • エコシステム連携: 他のPythonライブラリとのシームレスな結合

デメリット

  • メモリ使用量: 大量のメモリを消費する場合がある
  • パフォーマンス: 非常に大きなデータセットでは速度が低下
  • 学習コスト: 多機能のため初心者には難しい場合がある
  • データ型の制約: 特定のデータ型での制限
  • インデックスの複雑さ: マルチインデックスの理解が困難
  • スレッド安全性: マルチスレッド環境での制約

主要リンク

書き方の例

Hello World

import pandas as pd
import numpy as np

# Pandasのバージョン確認
print(f"Pandas version: {pd.__version__}")

# Seriesの作成
series = pd.Series([1, 2, 3, 4, 5], name='sample_series')
print("Series:")
print(series)

# DataFrameの作成
data = {
    'name': ['Alice', 'Bob', 'Charlie', 'Diana'],
    'age': [25, 30, 35, 28],
    'city': ['東京', '大阪', '名古屋', '福岡'],
    'salary': [50000, 60000, 70000, 55000]
}

df = pd.DataFrame(data)
print("\nDataFrame:")
print(df)

# 基本情報
print(f"\nデータの形状: {df.shape}")
print(f"カラム名: {df.columns.tolist()}")
print(f"データ型:\n{df.dtypes}")

データ読み込みと保存

import pandas as pd

# CSVファイルの読み込み
# df = pd.read_csv('data.csv', encoding='utf-8')

# Excelファイルの読み込み
# df = pd.read_excel('data.xlsx', sheet_name='Sheet1')

# JSONファイルの読み込み
# df = pd.read_json('data.json')

# SQLデータベースからの読み込み
# import sqlite3
# conn = sqlite3.connect('database.db')
# df = pd.read_sql_query('SELECT * FROM table_name', conn)

# サンプルデータの作成
data = {
    'product': ['A', 'B', 'C', 'D', 'E'],
    'price': [100, 150, 200, 120, 180],
    'quantity': [10, 5, 8, 15, 12],
    'category': ['電子', '服飾', '本', '電子', '服飾']
}
df = pd.DataFrame(data)

print("サンプルデータ:")
print(df)

# データの保存
# CSVで保存
# df.to_csv('output.csv', index=False, encoding='utf-8')

# Excelで保存
# df.to_excel('output.xlsx', index=False, sheet_name='data')

# JSONで保存
# df.to_json('output.json', orient='records', ensure_ascii=False, indent=2)

# Parquetで保存(高速・圧縮)
# df.to_parquet('output.parquet')

print("データの保存オプションをコメントアウトしています")

データの探索と選択

import pandas as pd
import numpy as np

# サンプルデータの作成
np.random.seed(42)
df = pd.DataFrame({
    'id': range(1, 101),
    'name': [f'User{i:03d}' for i in range(1, 101)],
    'age': np.random.randint(18, 65, 100),
    'salary': np.random.randint(30000, 100000, 100),
    'department': np.random.choice(['営業', '開発', '人事', 'マーケティング'], 100),
    'join_date': pd.date_range(start='2020-01-01', periods=100, freq='D')
})

# データの概要
print("データの概要:")
print(df.info())

# 統計情報
print("\n統計情報:")
print(df.describe())

# 最初の5行
print("\n最初の5行:")
print(df.head())

# 特定のカラム選択
print("\n名前と年齢のみ:")
print(df[['name', 'age']].head())

# 条件でフィルタリング
print("\n30歳以上のユーザー:")
filtered = df[df['age'] >= 30]
print(filtered[['name', 'age', 'department']].head())

# 複数条件
print("\n30歳以上かつ開発部のユーザー:")
complex_filter = df[(df['age'] >= 30) & (df['department'] == '開発')]
print(complex_filter[['name', 'age', 'salary']].head())

# ソート
print("\n年齢で降順ソート:")
sorted_df = df.sort_values('age', ascending=False)
print(sorted_df[['name', 'age', 'department']].head())

データの加工と変換

import pandas as pd
import numpy as np

# サンプルデータ
df = pd.DataFrame({
    'product': ['A', 'B', 'C', 'D', 'E', 'A', 'B'],
    'price': [100, 150, 200, 120, 180, 110, 160],
    'quantity': [10, 5, 8, 15, 12, 8, 6],
    'date': pd.date_range('2023-01-01', periods=7)
})

print("元データ:")
print(df)

# 新しいカラムの追加
df['total_value'] = df['price'] * df['quantity']
df['price_category'] = df['price'].apply(
    lambda x: '高価' if x >= 150 else ('中価' if x >= 120 else '安価')
)

print("\nカラム追加後:")
print(df)

# 文字列操作
df['product_code'] = 'PROD_' + df['product']
df['date_str'] = df['date'].dt.strftime('%Y-%m-%d')

# 缠失値の処理
df_with_nan = df.copy()
df_with_nan.loc[2, 'price'] = np.nan
df_with_nan.loc[4, 'quantity'] = np.nan

print("\n缠失値あり:")
print(df_with_nan)

# 缠失値の補完
df_filled = df_with_nan.fillna({
    'price': df_with_nan['price'].mean(),
    'quantity': df_with_nan['quantity'].median()
})

print("\n缠失値補完後:")
print(df_filled)

# 重複の除去
df_no_duplicates = df.drop_duplicates(subset=['product'])
print("\n重複除去後(productベース):")
print(df_no_duplicates)

グループ化と集計

import pandas as pd
import numpy as np

# サンプルデータ(売上データ)
np.random.seed(42)
df = pd.DataFrame({
    'date': pd.date_range('2023-01-01', periods=365),
    'region': np.random.choice(['東京', '大阪', '名古屋', '福岡'], 365),
    'product': np.random.choice(['A', 'B', 'C'], 365),
    'sales': np.random.randint(1000, 10000, 365),
    'quantity': np.random.randint(1, 50, 365)
})

# 日付関連カラムの追加
df['month'] = df['date'].dt.month
df['quarter'] = df['date'].dt.quarter

print("サンプルデータ:")
print(df.head())

# 地域別集計
print("\n地域別集計:")
region_summary = df.groupby('region').agg({
    'sales': ['sum', 'mean', 'count'],
    'quantity': ['sum', 'mean']
}).round(2)
print(region_summary)

# 製品別、月別集計
print("\n製品別月別売上:")
monthly_product = df.groupby(['product', 'month'])['sales'].sum().unstack(fill_value=0)
print(monthly_product.head())

# カスタム集計関数
def custom_stats(x):
    return pd.Series({
        'total': x.sum(),
        'average': x.mean(),
        'max': x.max(),
        'min': x.min(),
        'range': x.max() - x.min()
    })

print("\nカスタム集計:")
custom_summary = df.groupby('region')['sales'].apply(custom_stats)
print(custom_summary)

# ピボットテーブル
print("\nピボットテーブル(地域×製品):")
pivot_table = pd.pivot_table(
    df, 
    values='sales', 
    index='region', 
    columns='product', 
    aggfunc='sum',
    fill_value=0
)
print(pivot_table)

データの結合とマージ

import pandas as pd

# サンプルデータの作成
df1 = pd.DataFrame({
    'id': [1, 2, 3, 4],
    'name': ['Alice', 'Bob', 'Charlie', 'Diana'],
    'age': [25, 30, 35, 28]
})

df2 = pd.DataFrame({
    'id': [1, 2, 3, 5],
    'department': ['営業', '開発', '人事', 'マーケティング'],
    'salary': [50000, 60000, 55000, 65000]
})

print("DataFrame 1:")
print(df1)
print("\nDataFrame 2:")
print(df2)

# 内部結合(INNER JOIN)
print("\n内部結合:")
inner_join = pd.merge(df1, df2, on='id', how='inner')
print(inner_join)

# 左結合(LEFT JOIN)
print("\n左結合:")
left_join = pd.merge(df1, df2, on='id', how='left')
print(left_join)

# 外部結合(OUTER JOIN)
print("\n外部結合:")
outer_join = pd.merge(df1, df2, on='id', how='outer')
print(outer_join)

# DataFrameの連結
df3 = pd.DataFrame({
    'id': [6, 7],
    'name': ['Eve', 'Frank'],
    'age': [32, 29]
})

print("\n行方向の連結:")
concatenated = pd.concat([df1, df3], ignore_index=True)
print(concatenated)

# カラム方向の連結
df4 = pd.DataFrame({
    'country': ['日本', '日本', '日本', '日本'],
    'city': ['東京', '大阪', '名古屋', '福岡']
})

print("\nカラム方向の連結:")
column_concat = pd.concat([df1, df4], axis=1)
print(column_concat)

時系列データの処理

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 時系列データの作成
np.random.seed(42)
dates = pd.date_range('2023-01-01', periods=365, freq='D')
values = np.cumsum(np.random.randn(365)) + 100

ts_df = pd.DataFrame({
    'date': dates,
    'value': values
})

# 日付をインデックスに設定
ts_df.set_index('date', inplace=True)

print("時系列データ:")
print(ts_df.head())

# 日付関連カラムの追加
ts_df['year'] = ts_df.index.year
ts_df['month'] = ts_df.index.month
ts_df['quarter'] = ts_df.index.quarter
ts_df['day_of_week'] = ts_df.index.day_name()

# 移動平均
ts_df['ma_7'] = ts_df['value'].rolling(window=7).mean()
ts_df['ma_30'] = ts_df['value'].rolling(window=30).mean()

# 前日比、前月比
ts_df['value_diff'] = ts_df['value'].diff()
ts_df['value_pct_change'] = ts_df['value'].pct_change()

print("\n時系列特徴量追加後:")
print(ts_df.head(10))

# 月別集計
print("\n月別集計:")
monthly_summary = ts_df.resample('M').agg({
    'value': ['mean', 'max', 'min', 'std']
}).round(2)
print(monthly_summary.head())

# 特定期間のデータ抽出
print("\n2023年1月のデータ:")
january_data = ts_df['2023-01']
print(january_data.head())

# 統計情報
print("\n時系列データの統計:")
print(f"期間: {ts_df.index.min()} から {ts_df.index.max()}")
print(f"平均値: {ts_df['value'].mean():.2f}")
print(f"最大値: {ts_df['value'].max():.2f}")
print(f"最小値: {ts_df['value'].min():.2f}")