Pandasの高度な使い方

Pandasの高度な使い方

Pandasの高度な使い方として、以下のようなテクニックがあります。

これらはデータの前処理分析可視化に役立つ機能です。

1. 高度なデータフィルタリング

条件付きのフィルタリング複数条件のフィルタリングを行うことができます。

1
2
3
4
5
6
7
8
9
import pandas as pd

# サンプルデータの作成
data = {'A': [10, 20, 30, 40], 'B': [100, 200, 300, 400]}
df = pd.DataFrame(data)

# A列の値が20以上かつB列の値が300以下の行をフィルタリング
df_filtered = df[(df['A'] >= 20) & (df['B'] <= 300)]
print(df_filtered)

[実行結果]

    A    B
1  20  200
2  30  300

2. `apply`と`lambda`を使ったデータ変換

Pandasapply関数とlambdaを使ってカスタム関数を適用できます。

1
2
3
4
5
6
7
8
9
10
11
12
13
import numpy as np

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

# A列にカスタム関数を適用
df['A_squared'] = df['A'].apply(custom_function)

# B列にlambda関数を適用
df['B_log'] = df['B'].apply(lambda x: x if x == 0 else np.log(x))

print(df)

[実行結果]

    A    B  A_squared     B_log
0  10  100        100  4.605170
1  20  200        400  5.298317
2  30  300        900  5.703782
3  40  400       1600  5.991465

3. 時系列データの操作

Pandas時系列データの操作に強力な機能を提供します。

1
2
3
4
5
6
7
8
9
10
11
12
# サンプルの時系列データの作成
date_rng = pd.date_range(start='2023-01-01', end='2023-01-10', freq='D')
df_time = pd.DataFrame(date_rng, columns=['date'])
df_time['data'] = np.random.randint(0, 100, size=(len(date_rng)))

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

# リサンプリングして月ごとの平均を計算
df_monthly_mean = df_time.resample('M').mean()

print(df_monthly_mean)

[実行結果]

            data
date            
2023-01-31  39.7

4. `groupby`と`transform`によるデータの変換

groupbytransformを組み合わせて、グループごとに変換を行います。

1
2
3
4
5
6
7
8
# サンプルデータの作成
data = {'A': ['foo', 'bar', 'foo', 'bar'], 'B': [1, 2, 3, 4], 'C': [10, 20, 30, 40]}
df = pd.DataFrame(data)

# グループごとの平均を計算してB列を標準化
df['B_normalized'] = df.groupby('A')['B'].transform(lambda x: (x - x.mean()) / x.std())

print(df)

[実行結果]

     A  B   C  B_normalized
0  foo  1  10     -0.707107
1  bar  2  20     -0.707107
2  foo  3  30      0.707107
3  bar  4  40      0.707107

5. `merge`の高度な使い方

複数のキーを使った結合や、結合方法の指定(内部結合外部結合など)を行います。

1
2
3
4
5
6
7
8
# サンプルデータの作成
df1 = pd.DataFrame({'key1': ['A', 'B', 'C'], 'key2': [1, 2, 3], 'value': [10, 20, 30]})
df2 = pd.DataFrame({'key1': ['A', 'B', 'D'], 'key2': [1, 2, 4], 'value': [100, 200, 400]})

# 複数のキーを使った内部結合
df_merged = pd.merge(df1, df2, on=['key1', 'key2'], how='inner', suffixes=('_left', '_right'))

print(df_merged)

[実行結果]

  key1  key2  value_left  value_right
0    A     1          10          100
1    B     2          20          200

6. マルチインデックス

マルチインデックスを使って階層的なデータを操作します。

1
2
3
4
5
6
7
# サンプルデータの作成
arrays = [['A', 'A', 'B', 'B'], [1, 2, 1, 2]]
index = pd.MultiIndex.from_arrays(arrays, names=('letter', 'number'))
df_multi = pd.DataFrame({'value': [10, 20, 30, 40]}, index=index)

# 特定のレベルでデータを取得
print(df_multi.xs('A', level='letter'))

[実行結果]

        value
number       
1          10
2          20

7. パイプラインを使ったデータ操作の連鎖

パイプラインを使って複数の操作を連鎖させます。

1
2
3
4
5
6
7
8
9
10
# サンプルデータの作成
df = pd.DataFrame({'A': [1, 2, 3], 'B': [10, 20, 30]})

# パイプラインを使って操作を連鎖
df_transformed = (df
.assign(C=lambda x: x['A'] + x['B'])
.query('C > 15')
.rename(columns={'A': 'alpha', 'B': 'beta'}))

print(df_transformed)

[実行結果]

   alpha  beta   C
1      2    20  22
2      3    30  33

8. Window関数

Window関数を使ってローリング計算移動平均を計算します。

1
2
3
4
5
6
7
# サンプルデータの作成
df = pd.DataFrame({'A': range(10)})

# 移動平均の計算
df['moving_average'] = df['A'].rolling(window=3).mean()

print(df)

[実行結果]

   A  moving_average
0  0             NaN
1  1             NaN
2  2             1.0
3  3             2.0
4  4             3.0
5  5             4.0
6  6             5.0
7  7             6.0
8  8             7.0
9  9             8.0

これらの高度な使い方を活用することで、Pandasを使ったデータ操作分析がさらに効率的かつ強力になります。