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 |
重複する列名を区別するためのサフィックスを追加 |
例
# サンプルデータ
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 |
結合するオブジェクトに階層インデックスを提供します |
例
# サンプルデータ
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 |
使用する結合列。デフォルトはインデックスに基づく |
例
# サンプルデータ
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 |
欠損値の埋め合わせ |
例
# サンプルデータ
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 |
例
# サンプルデータ
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 |
例
# サンプルデータ
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 |
適用する関数 |
例
# サンプルデータ
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 |
例
# サンプルデータ
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 に適用) |
例
# サンプルデータ
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 |
集約関数。文字列またはカスタム関数を指定できます |
例
# サンプルデータ
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時間を表すなど) |
例
# 時系列を生成
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()時間の加算・減算操作ができます。
例
# 日付のシフト
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() |
拡張ウィンドウ操作を計算し、累積値を求めます |
例
# サンプルデータ
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 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 |
各インデックスレベルの名前(オプション) |
例
# タプルを作成
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 |
各インデックスレベルの名前(オプション) |
例
# 複数のリストを作成
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 |
インデックスとして使用する列名(単一列または複数列を指定可能) |
例
# サンプルデータ
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[]データを選択:
例
# サンプルデータ
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()メソッドは多重インデックス内の指定レベルのスライスを選択できます。
例
print(df.xs(1, level='Number'))
出力:
Value
Letter
A 10
B 30
2. マルチインデックスのスライス
Pandas は多重インデックスのスライス操作をサポートしており、インデックスレベルごとに異なるサブセットを選択できます。
例
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()を組み合わせると、強力な集計操作が可能になり、複雑なデータの統計分析に適しています。
例
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
その他の拡張