Pandasを使ったデータ操作と計算の基本

Python

pandasは、Pythonでデータを扱う際に非常に強力なツールです。特に、データ分析や機械学習の前処理などで頻繁に使われます。今回は、pandasでよく使用されるデータ操作や計算方法について解説します。これをマスターすることで、日常的なデータ処理を効率的に行えるようになります。

基本的な算術演算

pandasでは、データフレームやシリーズに対して基本的な算術演算を行います。これには、加算、減算、乗算、除算などが含まれます。

  • 加算: df['col1'] + df['col2']
  • 減算: df['col1'] - df['col2']
  • 乗算: df['col1'] * df['col2']
  • 除算: df['col1'] / df['col2']
df['new_col'] = df['col1'] + df['col2']  # col1とcol2を足してnew_colに保存

詳細な説明と例

例えば、商品の販売数と単価が記録されたデータフレームがあるとします。このデータを使って総売上を計算する例を紹介します。

import pandas as pd

# サンプルデータ
data = {'商品名': ['A', 'B', 'C'], '販売数': [10, 20, 30], '単価': [100, 150, 200]}
df = pd.DataFrame(data)

# 総売上を計算
df['総売上'] = df['販売数'] * df['単価']

print(df)

出力

 商品名  販売数  単価  総売上
0    A    10  100  1000
1    B    20  150  3000
2    C    30  200  6000

このコードでは、df['販売数'] * df['単価']という計算を行い、新しい「総売上」列にその結果を保存しています。

まとめと応用例

このような算術演算は、複数の列の値を組み合わせて新しい指標を作成する際に非常に役立ちます。例えば、売上データを使用して利益やコストなどの他の経済指標を計算することができます。


集計関数

データ全体、またはグループごとに集計を行います。

  • 合計: df['col'].sum()
  • 平均: df['col'].mean()
  • 中央値: df['col'].median()
  • 最大値: df['col'].max()
  • 最小値: df['col'].min()
  • 標準偏差: df['col'].std()
total_sales = df['sales'].sum()  # sales列の合計を計算

詳細な説明と例

pandasには、データを集計するための便利な関数が多数用意されています。これらの関数を使うことで、データ全体やグループごとの合計、平均、中央値、最大値、最小値などを簡単に計算することができます。

例えば、商品ごとの売上データがあるとします。このデータを使って売上の合計と平均を計算する例を紹介します。

# サンプルデータ
data = {'商品名': ['A', 'B', 'C'], '売上': [1000, 2000, 1500]}
df = pd.DataFrame(data)

# 合計と平均を計算
total_sales = df['売上'].sum()
average_sales = df['売上'].mean()

print(f"総売上: {total_sales}")
print(f"平均売上: {average_sales}")

出力

総売上: 4500
平均売上: 1500.0

このコードでは、sum()関数を使用して売上の合計を、mean()関数を使用して売上の平均を計算しています。

まとめと応用例

集計関数は、データの全体像を把握するために非常に有用です。複数の商品や期間のデータを集計して、売上や成績のトレンドを分析する際に役立ちます。


apply メソッドを使ったカスタム関数の適用

カスタム関数を各行または列に適用する際に使用します。lambda関数や定義済み関数を渡して、柔軟な計算が可能です。

  • : df['new_col'] = df['col'].apply(lambda x: x * 2)
# 各行にカスタム関数を適用
df['adjusted_sales'] = df.apply(lambda row: row['sales'] * 1.1 if row['category'] == 'A' else row['sales'], axis=1)

詳細な説明と例

applyメソッドを使用すると、データフレームの各行や列にカスタム関数を適用できます。これにより、標準的な関数では対応できない複雑なデータの変換や計算が可能になります。

例えば、商品の価格に基づいて「高価」または「安価」のラベルを付けたいとします。この場合、以下のようにカスタム関数をapplyメソッドで適用します。

# サンプルデータ
data = {'商品名': ['A', 'B', 'C'], '価格': [1000, 500, 1500]}
df = pd.DataFrame(data)

# 価格に基づいてラベルを付ける関数
def categorize_price(price):
return '高価' if price > 1000 else '安価'

# applyメソッドで関数を適用
df['価格カテゴリ'] = df['価格'].apply(categorize_price)

print(df)

出力

  商品名   価格 価格カテゴリ
0 A 1000 安価
1 B 500 安価
2 C 1500 高価

このコードでは、categorize_priceという関数を定義し、applyメソッドを使ってdf['価格']の各値に対してその関数を適用しています。

まとめと応用例

applyメソッドを使用することで、複雑なビジネスロジックをデータに適用することができます。たとえば、販売促進キャンペーンの効果を評価する際に、条件に基づいて異なるラベルをデータに付与することができます。


groupby を使ったグループ集計

特定のキーでデータをグループ化し、各グループに対して集計を行います。

  • : df.groupby('category').sum()
# categoryごとの売上合計を計算
grouped = df.groupby('category')['sales'].sum()

詳細な説明と例

groupbyを使うと、特定のキーに基づいてデータをグループ化し、各グループに対して集計を行うことができます。これにより、カテゴリごとのデータ分析が容易になります。

例えば、複数の店舗での売上データがあるとします。これを店舗ごとにグループ化して売上の合計を計算してみましょう。

# サンプルデータ
data = {'店舗': ['東京', '大阪', '東京', '大阪'], '売上': [1000, 2000, 1500, 2500]}
df = pd.DataFrame(data)

# 店舗ごとの売上合計を計算
grouped = df.groupby('店舗')['売上'].sum()

print(grouped)

出力

店舗
大阪 4500
東京 2500
Name: 売上, dtype: int64

このように、groupbyを使うことで、各グループごとの集計を簡単に行えます。

まとめと応用例

groupbyは、カテゴリごとにデータをまとめて分析する際に非常に便利です。売上データをグループ化して店舗や地域ごとのパフォーマンスを比較するなど、様々なビジネスシーンで活用できます。


pivot_table を使ったピボット集計

Excelのピボットテーブルのように、行と列でデータを整理し集計することができます。

  • : df.pivot_table(values='sales', index='category', columns='year', aggfunc='sum')
# categoryとyearごとの売上合計をピボットテーブルで集計
pivot = df.pivot_table(values='sales', index='category', columns='year', aggfunc='sum')

詳細な説明と例

pivot_tableを使うと、データを行と列に整理して集計することができます。これは、Excelのピボットテーブルと同様の操作です。

例えば、商品ごとの年別売上を集計したいとします。

# サンプルデータ
data = {'商品名': ['A', 'B', 'A', 'B'], '年': [2020, 2020, 2021, 2021], '売上': [1000, 1500, 2000, 2500]}
df = pd.DataFrame(data)

# ピボットテーブルで集計
pivot = df.pivot_table(values='売上', index='商品名', columns='年', aggfunc='sum')

print(pivot)

出力

年      2020   2021
商品名
A 1000 2000
B 1500 2500

このように、データを年やカテゴリごとに整理し、比較しやすくすることができます。

まとめと応用例

pivot_tableは、複雑なデータを整理して分析する際に非常に有用です。売上データを年やカテゴリごとに集計し、トレンドを視覚化するのに役立ちます。


条件付き計算 (np.where や apply の使用)

条件に基づいて値を変更したり、新しい列を作成したりします。

  • : df['high_sales'] = np.where(df['sales'] > 1000, True, False)
# salesが1000を超える場合はTrue、それ以外はFalseを設定
df['high_sales'] = np.where(df['sales'] > 1000, True, False)

詳細な説明と例

特定の条件に基づいて値を変更したり、新しい列を作成したりすることができます。np.whereを使うと簡単な条件分岐が可能で、applyを使うと複雑な条件分岐が可能です。

例えば、売上が1000以上なら「高売上」、それ以下なら「低売上」というラベルを付けたいとします。

import numpy as np

# サンプルデータ
data = {'商品名': ['A', 'B', 'C'], '売上': [900, 1200, 1000]}
df = pd.DataFrame(data)

# 条件付きでラベルを付ける
df['売上カテゴリ'] = np.where(df['売上'] >= 1000, '高売上', '低売上')

print(df)

出力

  商品名   売上 売上カテゴリ
0 A 900 低売上
1 B 1200 高売上
2 C 1000 高売上

np.whereを使えば、簡単に条件に基づく新しい列を追加できます。

まとめと応用例

条件付き計算は、データのフィルタリングや分類に非常に便利です。ビジネスでの売上分析や顧客セグメンテーションなど、様々な応用が考えられます。


移動平均・累積計算

移動平均や累積合計を計算します。

  • 移動平均: df['sales'].rolling(window=3).mean()
  • 累積合計: df['sales'].cumsum()
# salesの移動平均を計算(3行ごと)
df['rolling_avg'] = df['sales'].rolling(window=3).mean()

# salesの累積合計を計算
df['cumulative_sum'] = df['sales'].cumsum()

詳細な説明と例

移動平均は、連続するデータポイントの平均を計算し、データの傾向を滑らかにするために使います。一方、累積計算はデータが積み重なる様子を計算します。

例えば、商品の売上データの移動平均を計算してみましょう。

# サンプルデータ
data = {'日付': pd.date_range(start='2021-01-01', periods=5, freq='D'), '売上': [100, 200, 150, 300, 250]}
df = pd.DataFrame(data)

# 3日間の移動平均を計算
df['移動平均'] = df['売上'].rolling(window=3).mean()

# 累積売上を計算
df['累積売上'] = df['売上'].cumsum()

print(df)

出力

         日付   売上   移動平均   累積売上
0 2021-01-01 100 NaN 100
1 2021-01-02 200 NaN 300
2 2021-01-03 150 150.0 450
3 2021-01-04 300 216.7 750
4 2021-01-05 250 233.3 1000

移動平均を使用すると、データのトレンドを滑らかに表示できます。また、累積計算はデータの累積的な変化を示します。

まとめと応用例

移動平均は、データのトレンドを理解するために非常に有用です。特に、金融データや売上データの分析で、短期的な変動を平滑化するのに役立ちます。


データの正規化・標準化

各列のデータを正規化(0~1の範囲に収める)または標準化(平均0、標準偏差1に調整)します。

  • 正規化: (df['col'] - df['col'].min()) / (df['col'].max() - df['col'].min())
  • 標準化: (df['col'] - df['col'].mean()) / df['col'].std()
# sales列を正規化
df['normalized_sales'] = (df['sales'] - df['sales'].min()) / (df['sales'].max() - df['sales'].min())

詳細な説明と例

データの正規化は、値を0から1の範囲にスケーリングする手法です。標準化は、データを平均0、標準偏差1にスケーリングします。これにより、異なるスケールのデータを比較しやすくなります。

商品の売上データを正規化して、すべての値を0から1の範囲にスケールしましょう。

# サンプルデータ
data = {'商品名': ['A', 'B', 'C'], '売上': [1000, 2000, 1500]}
df = pd.DataFrame(data)

# 正規化
df['正規化売上'] = (df['売上'] - df['売上'].min()) / (df['売上'].max() - df['売上'].min())

# 標準化
df['標準化売上'] = (df['売上'] - df['売上'].mean()) / df['売上'].std()

print(df)

出力

  商品名   売上  正規化売上  標準化売上
0 A 1000 0.0 -1.0
1 B 2000 1.0 1.0
2 C 1500 0.5 0.0

このようにして、異なるスケールのデータを比較しやすくするための正規化と標準化を行います。

まとめと応用例

正規化や標準化は、機械学習モデルの前処理や、異なるスケールのデータを比較する際に必須の処理です。データ分析の精度を向上させるために、ぜひ覚えておきたい手法です。


条件付き集計 (pivot_table + aggfunc)

複数の集計方法を同時に使用し、データを集計します。

  • : df.pivot_table(values='sales', index='category', aggfunc=[np.sum, np.mean])
# categoryごとにsalesの合計と平均を同時に計算
agg_pivot = df.pivot_table(values='sales', index='category', aggfunc=[np.sum, np.mean])

詳細な説明と例

pivot_tableを使って、複数の集計方法を同時に使用し、データを整理できます。aggfuncパラメータを使うことで、合計や平均などの異なる集計方法を指定できます。

例えば、店舗ごとの売上データを合計と平均で集計してみましょう。

# サンプルデータ
data = {'店舗': ['東京', '大阪', '東京', '大阪'], '売上': [1000, 1500, 2000, 2500]}
df = pd.DataFrame(data)

# ピボットテーブルで売上の合計と平均を計算
pivot = df.pivot_table(values='売上', index='店舗', aggfunc=[sum, 'mean'])

print(pivot)

出力

        sum   mean
店舗
大阪 4000 2000.0
東京 3000 1500.0

このように、pivot_tableを使うと、異なる集計方法を組み合わせてデータを整理できます。

まとめと応用例

条件付き集計は、ビジネスデータの詳細な分析に役立ちます。売上データを様々な切り口で集計し、ビジネス戦略の決定に活用することができます。


merge を使ったデータフレームの結合

複数のデータフレームを特定のキーに基づいて結合します。

  • : pd.merge(df1, df2, on='key_column')
# df1とdf2をkey_columnで結合
merged_df = pd.merge(df1, df2, on='key_column')

詳細な説明と例

mergeを使うと、異なるデータフレームを特定のキーに基づいて結合できます。これにより、異なる情報源からのデータを一つにまとめて扱えます。

例えば、商品情報とその売上データを別々のデータフレームで持っている場合、これらを結合して一つのデータフレームにします。

# 商品情報データ
data1 = {'商品ID': [1, 2, 3], '商品名': ['A', 'B', 'C']}
df1 = pd.DataFrame(data1)

# 売上データ
data2 = {'商品ID': [1, 2, 3], '売上': [1000, 2000, 1500]}
df2 = pd.DataFrame(data2)

# 商品IDで結合
merged_df = pd.merge(df1, df2, on='商品ID')

print(merged_df)

出力

   商品ID 商品名   売上
0 1 A 1000
1 2 B 2000
2 3 C 1500

mergeを使うと、異なるデータソースを一つに統合し、分析しやすくなります。

まとめと応用例

mergeは、異なるデータセットを統合して分析する際に非常に便利です。例えば、顧客データと売上データを統合して、より深いインサイトを得ることができます。


resample を使った時系列データの集計

時系列データを特定の頻度に再サンプリングして集計します。

  • : df.resample('M').sum()(月単位で集計)
# 月単位で売上を集計
monthly_sales = df.resample('M', on='date_column')['sales'].sum()

詳細な説明と例

時系列データを特定の頻度に再サンプリングして集計することができます。これにより、日ごとのデータを月ごとにまとめるなど、柔軟な集計が可能です。

例えば、日ごとの売上データを月ごとに集計してみましょう。

# サンプルデータ
data = {'日付': pd.date_range(start='2021-01-01', periods=90, freq='D'), '売上': range(100, 190)}
df = pd.DataFrame(data)

# 月ごとの売上を集計
monthly_sales = df.resample('M', on='日付')['売上'].sum()

print(monthly_sales)

出力

日付
2021-01-31 3705
2021-02-28 3770
2021-03-31 3835
Freq: M, Name: 売上, dtype: int64

このように、resampleを使うと、日ごとのデータを月ごとに集計してトレンドを把握できます。

まとめと応用例

resampleは、時系列データの分析に非常に便利です。売上データやログデータを月ごとや年ごとに集計し、季節的なトレンドや長期的な傾向を把握するのに役立ちます。


データの並べ替え

データを特定の列に基づいて並べ替えます。

  • 昇順並べ替え: df.sort_values('col')
  • 降順並べ替え: df.sort_values('col', ascending=False)
# sales列で降順に並べ替え
sorted_df = df.sort_values('sales', ascending=False)

詳細な説明と例

データを特定の列に基づいて並べ替えることで、ランキングや重要なデータを簡単に抽出することができます。

例えば、売上データを降順に並べ替えて、最も売上が高い商品を見つけましょう。

# サンプルデータ
data = {'商品名': ['A', 'B', 'C'], '売上': [1000, 2000, 1500]}
df = pd.DataFrame(data)

# 売上で降順に並べ替え
sorted_df = df.sort_values('売上', ascending=False)

print(sorted_df)

出力

  商品名   売上
1 B 2000
2 C 1500
0 A 1000

並べ替えを使うことで、データの重要なポイントを簡単に見つけることができます。

まとめと応用例

データの並べ替えは、重要なデータを見つけるための基本的な操作です。売上ランキングを作成したり、最も価値の高い取引を抽出したりする際に非常に有用です。


まとめ

pandasを使うと、非常に柔軟で強力なデータ操作や計算が可能になります。今回紹介した各手法を理解し、適切に使い分けることで、日常的なデータ処理や分析を効率化できるでしょう。これらの手法を参考に、より高度なデータ分析に挑戦してみてください。

コメント

タイトルとURLをコピーしました