Python・PandasのGroupByで負の値と正の値をそれぞれ合計する方法
データ分析では、カテゴリごとに負の値と正の値を分けて集計したいケースがよくあります。Pandasのgroupby()とagg()を組み合わせれば、この処理をシンプルに実現できます。本記事では、気温データを例に、場所(Place)ごとの負の値と正の値を個別に合計する方法を解説します。
1. 正負の値を含むDataFrameを作成する
まず、正の値と負の値が混在したDataFrameを作成します。ここでは各都市の気温(摂氏)を格納したサンプルデータを用意します。
import pandas as pd
# 気温(摂氏)を含むDataFrameを作成
dataFrame = pd.DataFrame({
'Place': ['Chicago', 'Denver', 'Atlanta', 'Chicago', 'Dallas', 'Denver', 'Dallas', 'Atlanta'],
'Temperature': [-2, 30, -5, 10, 30, -5, 20, -10]
})
print(dataFrame)
2. groupby()でPlace列を基準にグループ化する
次に、groupby()を使って「Place」列を基準にデータをグループ化します。
groupRes = dataFrame.groupby(dataFrame['Place'])
3. 集計用の関数を定義する
正の値のみを合計する関数と、負の値のみを合計する関数をそれぞれ定義します。条件に一致する要素だけを抽出し、その合計値を返す仕組みです。
# 正の値のみを合計する関数
def plus(val):
return val[val > 0].sum()
# 負の値のみを合計する関数
def minus(val):
return val[val < 0].sum()
4. agg()で複数の集計を同時に適用する
agg()メソッドを使うと、定義した関数に任意の列名を付けて、一度に複数の集計結果を取得できます。
print(groupRes['Temperature'].agg([('negTemp', minus), ('posTemp', plus)]))
完全なコード例
ここまでの手順をまとめた完全なコードは以下の通りです。
import pandas as pd
# 気温(摂氏)を含むDataFrameを作成
dataFrame = pd.DataFrame({
'Place': ['Chicago', 'Denver', 'Atlanta', 'Chicago', 'Dallas', 'Denver', 'Dallas', 'Atlanta'],
'Temperature': [-2, 30, -5, 10, 30, -5, 20, -10]
})
print(dataFrame)
# Place列を基準にグループ化
groupRes = dataFrame.groupby(dataFrame['Place'])
# 正負それぞれの値を合計する関数
def plus(val):
return val[val > 0].sum()
def minus(val):
return val[val < 0].sum()
# 負の温度と正の温度を個別に集計して表示
print(groupRes['Temperature'].agg([('negTemp', minus), ('posTemp', plus)]))
実行結果
上記のコードを実行すると、以下の出力が得られます。
Place Temperature
0 Chicago -2
1 Denver 30
2 Atlanta -5
3 Chicago 10
4 Dallas 30
5 Denver -5
6 Dallas 20
7 Atlanta -10
negTemp posTemp
Place
Atlanta -15 0
Chicago -2 10
Dallas 0 50
Denver -5 30
出力結果の読み方
結果の見方を簡単に整理します。
- Atlanta: 負の値は -5 と -10 の合計 -15、正の値はないため 0
- Chicago: 負の値は -2 のみで -2、正の値は 10 のみで 10
- Dallas: 負の値はないため 0、正の値は 30 と 20 の合計 50
- Denver: 負の値は -5 のみで -5、正の値は 30 のみで 30
このように、条件に該当する値が存在しない場合は sum() の仕様により 0 が返されます。売上と返品、収入と支出など、符号で意味が異なる数値データを分析する際に非常に便利なテクニックなので、ぜひ活用してみてください。
-
Python Pandas入門:interpolate()メソッドでNaN値を補間して埋める方法
はじめにPandasでは、interpolate()メソッドを使うことで、DataFrame内の欠損値(NaN)を補間によって効率的に埋めることができます。このメソッドは、前後の値をもとに線形補間を行い、データの流れを保ちながら自然な形で欠損値を推定します。ここでは、Microsoft Excelで開いた以下のようなCSVファイルを例に説明します。このデータには一部NaN値が含まれています。1. CSVファイルからデータを読み込むまず、read_csv()関数を使って、CSVファイルのデータをPandas DataFrameに読み込みます。dataFrame = pd.read_csv(C:\
-
【Python Pandas】fillnaで欠損値(NaN)を後方の値で埋める方法(bfill)
はじめに PandasのDataFrameには、データの読み込みミスや入力漏れなどによって欠損値(NaN)が含まれることがあります。このような欠損値を処理する方法のひとつが、「後ろにある有効な値を前方向きに引き継いで埋める」という後方補完(Backward Fill)です。 本記事では、fillna()メソッドのmethodパラメータにbfillを指定して、null以外の値を後方から伝播させる方法を解説します。 bfillの基本的な使い方 後方補完を行うには、fillna()メソッドの引数に以下のように指定します。 fillna(method=bfill) bfillは「backward f