Python
 Computer >> コンピューター >  >> プログラミング >> Python

【Python】PandasでDataFrameを月ごとにグループ化して集計する方法

Pandasではgroupby()メソッドとpd.Grouper()を組み合わせることで、日付データを持つDataFrameを簡単に月ごとにグループ化できます。本記事では、車の販売記録を例に、月単位でデータをまとめ、登録価格(Reg_Price)の合計を算出する方法を解説します。

サンプルとなるDataFrameを作成する

まずは、「Car(車名)」「Date_of_Purchase(購入日)」「Reg_Price(登録価格)」の3つの列を持つDataFrameを用意します。

import pandas as pd

# Date_of_Purchase(購入日)列を含むDataFrameを作成
dataFrame = pd.DataFrame(
    {
        "Car": ["Audi", "Lexus", "Tesla", "Mercedes", "BMW", "Toyota", "Nissan", "Bentley", "Mustang"],

        "Date_of_Purchase": [
            pd.Timestamp("2021-06-10"),
            pd.Timestamp("2021-07-11"),
            pd.Timestamp("2021-06-25"),
            pd.Timestamp("2021-06-29"),
            pd.Timestamp("2021-03-20"),
            pd.Timestamp("2021-01-22"),
            pd.Timestamp("2021-01-06"),
            pd.Timestamp("2021-01-04"),
            pd.Timestamp("2021-05-09")
        ],

        "Reg_Price": [1000, 1400, 1100, 900, 1700, 1800, 1300, 1150, 1350]
    }
)

print("DataFrame...\n", dataFrame)

Grouperを使って月ごとにグループ化する

groupby()関数の中でpd.Grouper()を使用し、キーとして日付列「Date_of_Purchase」を指定します。頻度を表すfreq引数に'M'(月末)を設定することで、月単位でのグループ化が可能になります。

# groupby内でGrouperを使用してDate_of_Purchase列を選択
print("\nGroup Dataframe by month...\n",
      dataFrame.groupby(pd.Grouper(key='Date_of_Purchase', axis=0, freq='M')).sum())

補足: Pandas 2.2以降では、月ごとの頻度指定'M'は非推奨となり、代わりに'ME'(Month End)の使用が推奨されています。新しい環境ではfreq='ME'と指定するとよいでしょう。

完全なコード例

import pandas as pd

# Date_of_Purchase(購入日)列を含むDataFrameを作成
dataFrame = pd.DataFrame(
    {
        "Car": ["Audi", "Lexus", "Tesla", "Mercedes", "BMW", "Toyota", "Nissan", "Bentley", "Mustang"],

        "Date_of_Purchase": [
            pd.Timestamp("2021-06-10"),
            pd.Timestamp("2021-07-11"),
            pd.Timestamp("2021-06-25"),
            pd.Timestamp("2021-06-29"),
            pd.Timestamp("2021-03-20"),
            pd.Timestamp("2021-01-22"),
            pd.Timestamp("2021-01-06"),
            pd.Timestamp("2021-01-04"),
            pd.Timestamp("2021-05-09")
        ],

        "Reg_Price": [1000, 1400, 1100, 900, 1700, 1800, 1300, 1150, 1350]
    }
)

print("DataFrame...\n", dataFrame)

# groupby内でGrouperを使用してDate_of_Purchase列を選択し、月ごとに集計
print("\nGroup Dataframe by month...\n",
      dataFrame.groupby(pd.Grouper(key='Date_of_Purchase', axis=0, freq='M')).sum())

実行結果

上記のコードを実行すると、以下のような出力が得られます。各月の登録価格の合計が計算され、月末の日付がインデックスとして表示されます。なお、該当するデータが存在しない月(2月・4月など)はNaNとして表示されます。

DataFrame...
      Car   Date_of_Purchase    Reg_Price
0     Audi   2021-06-10          1000
1    Lexus   2021-07-11          1400
2    Tesla   2021-06-25          1100
3 Mercedes   2021-06-29           900
4      BMW   2021-03-20          1700
5   Toyota   2021-01-22          1800
6   Nissan   2021-01-06          1300
7  Bentley   2021-01-04          1150
8  Mustang   2021-05-09          1350
Group Dataframe by month...
                     Reg_Price
Date_of_Purchase
2021-01-31             4250.0
2021-02-28                NaN
2021-03-31             1700.0
2021-04-30                NaN
2021-05-31             1350.0
2021-06-30             3000.0
2021-07-31             1400.0

まとめ

このように、groupby()pd.Grouper()を組み合わせれば、日付データを意識することなく月単位の集計をシンプルに実装できます。freq引数の値を変更すれば、四半期('Q')や年('Y' / 'YE')など、さまざまな期間での集計にも応用可能です。売上分析や時系列データの前処理など、実務でも頻繁に使われるテクニックなので、ぜひ覚えておきましょう。

  1. 【Python】Pandas DataFrameからサブセット(列の一部)を選択する方法

    Pandas DataFrameのサブセット選択とは? Pandasでは、DataFrameから必要な列や行だけを取り出す操作を「サブセットの選択」と呼びます。大きなデータセットから目的のデータだけを抽出できれば、分析や前処理の効率が大幅に向上します。 この記事では、CSVファイルを読み込んだDataFrameから、1つの列、および複数の列を選択する基本的な方法を解説します。 使用するCSVファイルの内容 今回使用する「SalesData.csv」は、Microsoft Excelで開くと以下のような内容になっています。 CSVファイルからDataFrameを作成する まず、pd.rea

  2. PythonでPandas DataFrameを棒グラフとして可視化する方法

    データ分析において、PandasのDataFrameを視覚的に表現することは非常に重要です。この記事では、CSVファイルから読み込んだデータをmatplotlibを使って棒グラフ(バーチャート)として表示する方法を解説します。 前提条件:サンプルデータ 今回は以下のような内容のCSVファイル(SalesData.csv)を使用します。 Car Reg_Price 0 BMW 2000 1 Lexus 1500 2 Audi 1500 3 Jaguar 2000 4 Mustang