Pandas 高度な機能

Pandas は非常に強力なデータ操作機能を提供し、複雑なデータクリーニング、分析、集約、時系列処理などのタスクに適しています。Pandas の高度な機能を習得することで、データ処理と分析の効率を大幅に向上させることができます。


一、データの結合と連結

Pandas は異なる DataFrame を結合・連結するための複数のメソッドを提供しています。例えば、merge()、concat()とjoin()。これらのメソッドは、複数のデータセットの処理や複雑な結合タスクによく使用されます。

1. merge()— データベース形式の結合

merge()メソッドは、特定の列に基づいて2つの DataFrame をマージすることを可能にします。SQL のJOIN操作に似ています。内部結合、外部結合、左結合、右結合をサポートします。

パラメータ 説明
left 左側の DataFrame
right 右側の DataFrame
how 結合方法。サポート:'inner', 'outer', 'left', 'right'
on 結合する列名(両側の列名が異なる場合は、left_onとright_on)
left_on 左側の DataFrame の結合列
right_on 右側の DataFrame の結合列
suffixes 重複する列名を区別するためのサフィックスを追加

例

import pandas as pd

# サンプルデータ
left = pd.DataFrame({'ID': [1, 2, 3], 'Name': ['Alice', 'Bob', 'Charlie']})
right = pd.DataFrame({'ID': [1, 2, 4], 'Age': [24, 27, 22]})

# merge を使用して内部結合を実行
result = pd.merge(left, right, on='ID', how='inner')
print(result)

出力:

   ID     Name  Age
0   1    Alice   24
1   2      Bob   27

2. concat()— 軸に沿った連結

concat()複数の DataFrame を指定した軸(行または列)に沿って連結するために使用されます。行の結合(垂直連結)や列の結合(水平連結)によく使われます。

パラメータ 説明
objs 結合する DataFrame のリスト
axis 結合する軸。0は行方向の結合を意味し、1は列方向の結合を意味します
ignore_index インデックスを無視して再生成するかどうか(デフォルトはFalse)
keys 結合するオブジェクトに階層インデックスを提供します

例

import pandas as pd

# サンプルデータ
df1 = pd.DataFrame({'A': [1, 2, 3]})
df2 = pd.DataFrame({'A': [4, 5, 6]})

# 行方向の結合
result = pd.concat([df1, df2], axis=0, ignore_index=True)
print(result)

出力:

   A
0  1
1  2
2  3
3  4
4  5
5  6

3. join()— インデックスに基づく結合

join()メソッドは Pandas における簡易的な結合操作で、通常はインデックスに基づいて複数の DataFrame を結合するために使用されます。

パラメータ 説明
other 結合するもう1つの DataFrame
how 結合方法。サポート:'left', 'right', 'outer', 'inner'
on 使用する結合列。デフォルトはインデックスに基づく

例

import pandas as pd

# サンプルデータ
left = pd.DataFrame({'A': [1, 2, 3]}, index=[1, 2, 3])
right = pd.DataFrame({'B': [4, 5, 6]}, index=[1, 2, 4])

# join を使用して結合
result = left.join(right, how='inner')
print(result)

出力:

   A  B
1  1  4
2  2  5

二、ピボットテーブルとクロス集計表

Pandas はpivot_table()メソッドでピボットテーブルを作成し、crosstab()メソッドでクロス集計表を計算できます。ピボットテーブルとクロス集計表はどちらもデータの要約と再配置に非常に適しています。

1. pivot_table()— ピボットテーブルの作成

パラメータ 説明
data 入力データ
values 集約する列
index 行インデックスとして使用する列
columns 列インデックスとして使用する列
aggfunc 集約関数。デフォルトはmean。指定可能な値:sum, count 等
fill_value 欠損値の埋め合わせ

例

import pandas as pd

# サンプルデータ
data = {'Date': ['2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04'],
        'Category': ['A', 'B', 'A', 'B'],
        'Sales': [100, 150, 200, 250]}
df = pd.DataFrame(data)

# ピボットテーブルの作成
pivot_table = pd.pivot_table(df, values='Sales', index='Date', columns='Category', aggfunc='sum', fill_value=0)
print(pivot_table)

出力:

Category         A    B
Date                    
2024-01-01     100    0
2024-01-02       0  150
2024-01-03     200    0
2024-01-04       0  250

2. crosstab()— クロス集計表の作成

パラメータ 説明
index 行ラベル
columns 列ラベル
values 計算に使用するデータ(オプション)
aggfunc 集約関数。デフォルトはcount

例

import pandas as pd

# サンプルデータ
data = {'Category': ['A', 'B', 'A', 'B', 'A', 'B'],
        'Region': ['North', 'South', 'North', 'South', 'West', 'East']}
df = pd.DataFrame(data)

# クロス集計表の作成
cross_table = pd.crosstab(df['Category'], df['Region'])
print(cross_table)

出力:

Region    East  North  South  West
Category                         
A           0      2      0     1
B           1      0      1     0

三、カスタム関数の適用

Pandas は、データクリーニングと変換のためにカスタム関数を適用する複数のメソッドを提供しています。

1. apply()— DataFrame または Series への関数の適用

apply()メソッドは、DataFrame または Series にカスタム関数を適用することを可能にし、行または列に対する操作をサポートします。

パラメータ 説明
func 適用する関数
axis デフォルトは0。列方向に適用することを意味します。1行方向に適用することを意味します
raw 元のデータを渡すかどうか(デフォルトはFalse)
result_type 出力の型を定義します。例:expand, reduce, broadcast

例

import pandas as pd

# サンプルデータ
df = pd.DataFrame({'A': [1, 2, 3, 4], 'B': [10, 20, 30, 40]})

# カスタム関数を定義
def custom_func(x):
    return x * 2

# 列に関数を適用
df['A'] = df['A'].apply(custom_func)
print(df)

出力:

   A   B
0  2  10
1  4  20
2  6  30
3  8  40

2. applymap()— DataFrame 全体への関数の適用

applymap()DataFrame にのみ適用でき、DataFrame 内の各要素に作用します。

パラメータ 説明
func 適用する関数

例

import pandas as pd

# サンプルデータ
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})

# DataFrame にカスタム関数を適用
df = df.applymap(lambda x: x ** 2)
print(df)

出力:

   A  B
0  1  16
1  4  25
2  9  36

3. map()— Series への関数の適用

map()Series の各要素に関数またはマッピング関係を適用できます。

パラメータ 説明
arg 適用する関数、辞書、または Series

例

import pandas as pd

# サンプルデータ
df = pd.DataFrame({'A': ['cat', 'dog', 'rabbit']})

# 辞書を使用してマッピング
df['A'] = df['A'].map({'cat': 'kitten', 'dog': 'puppy'})
print(df)

出力:

       A
0  kitten
1   puppy
2     NaN

四、グループ化操作と集約

Pandas のgroupby()メソッドは非常に強力で、グループ集約、データ変換、データフィルタリングに使用できます。groupby()を使用すると、データを特定の条件に基づいてグループ化し、合計、平均、カウントなどの集約演算を実行できます。

1. groupby()— データのグループ化

パラメータ 説明
by どの列またはインデックスでグループ化するか
axis グループ化する軸。デフォルトは0。つまり行方向にグループ化します
level インデックスのレベルに基づいてグループ化(MultiIndex に適用)

例

import pandas as pd

# サンプルデータ
df = pd.DataFrame({
    'Category': ['A', 'B', 'A', 'B', 'A', 'B'],
    'Value': [10, 20, 30, 40, 50, 60]
})

# Category 列でグループ化し、各グループの合計を計算
grouped = df.groupby('Category')['Value'].sum()
print(grouped)

出力:

Category
A    90
B    120
Name: Value, dtype: int64

2. 集約操作(agg())

agg()複雑な集約操作を実行するために使用され、複数の関数を渡して複数の集約値を同時に計算できます。

パラメータ 説明
func 集約関数。文字列またはカスタム関数を指定できます

例

import pandas as pd

# サンプルデータ
df = pd.DataFrame({
    'Category': ['A', 'B', 'A', 'B', 'A', 'B'],
    'Value': [10, 20, 30, 40, 50, 60]
})

# agg() を使用して複数の集計操作を行う
grouped = df.groupby('Category')['Value'].agg([sum, min, max])
print(grouped)

出力:

          sum  min  max
Category                
A          90   10   50
B         120   20   60

五、時系列処理

Pandas は、日付解析、頻度変換、日付範囲の生成、時間ウィンドウ操作など、強力な時系列処理機能を提供します。

1. date_range()— 時系列の生成

パラメータ 説明
start 開始日
end 終了日
periods 生成する時点の数
freq 頻度(例:D日を表し、H時間を表すなど)

例

import pandas as pd

# 時系列を生成
date_range = pd.date_range(start='2024-01-01', periods=5, freq='D')
print(date_range)

出力:

DatetimeIndex(['2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04', '2024-01-05'], dtype='datetime64[ns]', freq='D')

2. 日付と時刻のオフセット

を使用するとpd.Timedelta()時間の加算・減算操作ができます。

例

import pandas as pd

# 日付のシフト
date = pd.to_datetime('2024-01-01')
new_date = date + pd.Timedelta(days=10)
print(new_date)

出力:

2024-01-11 00:00:00

3. 時間ウィンドウ操作(Rolling, Expanding)

を使用してrolling()とexpanding()ローリングおよび拡張ウィンドウ操作を行います。時系列における移動平均などの計算によく使用されます。

メソッド 説明
rolling() ローリングウィンドウ操作を計算します。移動平均などによく使用されます
expanding() 拡張ウィンドウ操作を計算し、累積値を求めます

例

import pandas as pd

# サンプルデータ
df = pd.DataFrame({'Value': [10, 20, 30, 40, 50]})

# 3日間のローリング平均を計算
df['Rolling_Mean'] = df['Value'].rolling(window=3).mean()
print(df)

出力:

   Value  Rolling_Mean
0     10            NaN
1     20            NaN
2     30     20.000000
3     40     30.000000
4     50     40.000000

六、欠損値の処理

Pandas は、欠損値(NaN など)を処理するためのさまざまなメソッドを提供します。一般的な操作には、欠損値の補完、欠損値の削除などがあります。

メソッド 説明
isna() 欠損値をチェックし、ブール値を返します
fillna() 欠損値を補完します
dropna() 欠損値を含む行または列を削除します

例

import pandas as pd
import numpy as np

# サンプルデータ
df = pd.DataFrame({
    'A': [1, 2, np.nan, 4],
    'B': [5, np.nan, 7, 8]
})

# 欠損値を補完
df_filled = df.fillna(0)
print(df_filled)

出力:

   A  B
0  1  5
1  2  0
2  0  7
3  4  8

七、マルチインデックス(MultiIndex)

Pandas は多重インデックス(MultiIndex)の機能を提供し、DataFrame や Series で複雑なデータ構造を処理できるようにします。特に階層的なデータに適しています。多重インデックスを使用することで、データのグループ化、選択、スライス、集計などの操作が可能になります。

1. マルチインデックスの作成

を使用してpd.MultiIndex.from_tuples()、pd.MultiIndex.from_product()またはset_index()メソッドで多重インデックスを作成できます。

方法 1:pd.MultiIndex.from_tuples()

タプルを使用して多重インデックスを作成します。各タプルが1つのインデックスレベルに対応します。

パラメータ 説明
tuples 各タプルが1つのインデックス値に対応します
names 各インデックスレベルの名前(オプション)

例

import pandas as pd

# タプルを作成
index_tuples = [('A', 1), ('A', 2), ('B', 1), ('B', 2)]

# 多重インデックスを作成
multi_index = pd.MultiIndex.from_tuples(index_tuples, names=['Letter', 'Number'])

# DataFrame を作成
df = pd.DataFrame({'Value': [10, 20, 30, 40]}, index=multi_index)
print(df)

出力:

               Value
Letter Number       
A      1          10
       2          20
B      1          30
       2          40

方法 2: pd.MultiIndex.from_product()

複数のリストのデカルト積を使用して多重インデックスを作成します。データの次元が多い場合に適しています。

パラメータ 説明
iterables 複数のリストまたは配列
names 各インデックスレベルの名前(オプション)

例

import pandas as pd

# 複数のリストを作成
index_values = [['A', 'B'], [1, 2]]

# 多重インデックスを作成
multi_index = pd.MultiIndex.from_product(index_values, names=['Letter', 'Number'])

# DataFrame を作成
df = pd.DataFrame({'Value': [10, 20, 30, 40]}, index=multi_index)
print(df)

出力:

               Value
Letter Number       
A      1          10
       2          20
B      1          30
       2          40

方法 3: 使用set_index()マルチインデックスの作成

set_index()メソッドは DataFrame の列を多重インデックスに変換でき、既存のデータから多重インデックスを作成する場合に適しています。

パラメータ 説明
keys インデックスとして使用する列名(単一列または複数列を指定可能)

例

import pandas as pd

# サンプルデータ
data = {
    'Letter': ['A', 'A', 'B', 'B'],
    'Number': [1, 2, 1, 2],
    'Value': [10, 20, 30, 40]
}

df = pd.DataFrame(data)

# 多重インデックスを設定
df.set_index(['Letter', 'Number'], inplace=True)
print(df)

出力:

               Value
Letter Number       
A      1          10
       2          20
B      1          30
       2          40

2. マルチインデックスの操作

1. マルチインデックスデータへのアクセス

階層インデックスを使用してデータにアクセスできます。loc[] 或 xs()(cross-section)を使用すると、データを簡単に選択できます。

を使用loc[]データを選択:

例

import pandas as pd

# サンプルデータ
data = {
    'Letter': ['A', 'A', 'B', 'B'],
    'Number': [1, 2, 1, 2],
    'Value': [10, 20, 30, 40]
}

df = pd.DataFrame(data)

# 多重インデックスを設定
df.set_index(['Letter', 'Number'], inplace=True)

# 'A' カテゴリ、すべての 'Number' が 1 のデータを選択
print(df.loc['A', 1])

出力:

Value    10
Name: (A, 1), dtype: int64

を使用xs()クロスデータを取得:

xs()メソッドは多重インデックス内の指定レベルのスライスを選択できます。

例

# xs を使用して 'Number' が 1 のすべてのデータを取得
print(df.xs(1, level='Number'))

出力:

        Value
Letter       
A          10
B          30

2. マルチインデックスのスライス

Pandas は多重インデックスのスライス操作をサポートしており、インデックスレベルごとに異なるサブセットを選択できます。

例

# Letter が 'A' のすべてのデータを選択
print(df.loc['A'])

出力:

        Value
Number       
1          10
2          20

3. マルチインデックスのソート

Pandas のsort_index()メソッドは多重インデックスの並べ替えをサポートしています。

例

# 多重インデックスで並べ替え
df_sorted = df.sort_index(level=['Letter', 'Number'], ascending=[True, False])
print(df_sorted)

出力:

               Value
Letter Number       
A      2          20
       1          10
B      2          40
       1          30

4. 集約操作

多重インデックスとgroupby()を組み合わせると、強力な集計操作が可能になり、複雑なデータの統計分析に適しています。

例

# groupby を使用して多重インデックスを集計
df_grouped = df.groupby(['Letter', 'Number']).sum()
print(df_grouped)

出力:

               Value
Letter Number       
A      1          10
       2          20
B      1          30
       2          40

5. インデックスのリセット

を使用するとreset_index()メソッドで多重インデックスを通常の列にリセットできます。

例

# インデックスをリセット
df_reset = df.reset_index()
print(df_reset)

出力:

  Letter  Number  Value
0      A       1     10
1      A       2     20
2      B       1     30
3      B       2     40

6. マルチインデックスの欠損値

多重インデックス内の欠損値は、fillna() 或 dropna()を使用して処理できます。通常のインデックスと同様です。

例

# サンプルデータに欠損値を導入
data = {
    'Letter': ['A', 'A', 'B', 'B'],
    'Number': [1, 2, 1, 2],
    'Value': [10, None, 30, 40]
}

df = pd.DataFrame(data)
df.set_index(['Letter', 'Number'], inplace=True)

# 欠損値を補完
df_filled = df.fillna(0)
print(df_filled)

出力:

               Value
Letter Number       
A      1          10
       2           0
B      1          30
       2          40
その他の拡張