Pandas groupby.sum() 関数

Pandas よく使う関数


groupby.sum()は、Pandasにおいてグループ化後に合計を求めるための集約関数です。通常はgroupby()関数と組み合わせて使用します。まずデータを特定の列の値でグループ化し、その後、各グループ内の数値列に対して合計計算を行います。

実際のデータ分析では、sum()最もよく使われる集約関数の1つです。例えば、各部門の給与合計、各地域の売上合計、各カテゴリの数量合計などを計算します。


基本構文とパラメータ

sum()はGroupByオブジェクトのメンバー関数であり、最初にgroupby()でグループ化してから呼び出す必要があります。

構文形式

GroupBy.sum(numeric_only=False, min_count=-1, engine=None, engine_kwargs=None)

パラメータの説明

パラメータ 型 説明 デフォルト値
numeric_only bool Trueの場合は数値列のみ合計し、Falseの場合はすべての列に対して合計を試みます。 False
min_count int 合計に必要な有効値の最小数。グループ内の有効値がこの数より少ない場合はNaNを返します。 -1
engine str 計算エンジンを指定します。'cython'または'numba'を指定できます。NoneはPandasが自動的に選択することを意味します。 None
engine_kwargs dict 基盤となるエンジンに渡す追加パラメータの辞書。 None

戻り値

  • 戻り値の型:Series 或 DataFrame
  • 説明:グループ化して合計した結果を返します。単一列に使用した場合はSeriesを返し、複数列に使用した場合はDataFrameを返します。

実例

簡単なものから複雑なものまでの一連の例を通して、徹底的にgroupby.sum()の使い方を習得しましょう。

例1:基本の使い方 - 単一列でグループ化して合計

最も基本的な使い方は、ある列の値でグループ化し、別の列の合計を計算することです。

実例

import pandas as pd

# 販売データのDataFrameを作成
# 地域、製品、売上高を含むテーブルを模擬
data = {
    '地域': ['華北', '華東', '華南', '華北', '華東', '華南', '華北', '華東'],
    '製品': ['A', 'B', 'C', 'B', 'A', 'C', 'A', 'B'],
    '売上高': [1000, 2000, 1500, 1800, 2200, 1600, 1200, 2100],
    '数量': [10, 20, 15, 18, 22, 16, 12, 21]
}

# DataFrameを作成
df = pd.DataFrame(data)

print("元の販売データ:")
print(df)
print()

# "地域"でグループ化し、各地域の総売上高を計算
sales_by_region = df.groupby('地域')['売上高'].sum()

print("各地域の総売上高:")
print(sales_by_region)
print()

# "製品"でグループ化し、各製品の総販売数量を計算
quantity_by_product = df.groupby('製品')['数量'].sum()

print("各製品の総販売数量:")
print(quantity_by_product)

実行結果:

原始销售数据:
  地区  产品   销售额   数量
0  华北   A   1000    10
1  华东   B   2000    20
2  华南   C   1500    15
3  华北   B   1800    18
4  华东   A   2200    22
5  华南   C   1600    16
6  华北   A   1200    12
7  华东   B   2100    21

每个地区的总销售额:
地区
华东    7100
华南    3100
华北    4000
dtype: int64

每个产品的总销售数量:
产品
A    44
B    59
C    31
dtype: int64

コードの解説:

  1. df.groupby('地区')['销售额']は、最初に"地域"列でグループ化してから、"売上高"列を選択して操作することを示します。
  2. .sum()各グループ内の売上高を合計します。
  3. 返される結果はSeriesで、インデックスはグループ化した列の値(各地域名)です。

例2:複数列でのグループ化合計

複数の列で同時にグループ化し、数値列の合計を計算できます。

実例

import pandas as pd

# 販売データを作成
data = {
    '地域': ['華北', '華東', '華南', '華北', '華東', '華南', '華北', '華東'],
    '製品': ['A', 'B', 'C', 'B', 'A', 'C', 'A', 'B'],
    '売上高': [1000, 2000, 1500, 1800, 2200, 1600, 1200, 2100],
    '数量': [10, 20, 15, 18, 22, 16, 12, 21]
}
df = pd.DataFrame(data)

print("元の販売データ:")
print(df)
print()

# "地域"と"製品"の2列でグループ化し、総売上高と総数量を計算
# as_index=False は、グループ化列を通常の列として結果に保持することを意味します
grouped = df.groupby(['地域', '製品'], as_index=False).sum()

print("地域と製品でグループ化した後の合計:")
print(grouped)
print()

# 列を指定せずに、すべての数値列を合計することもできます
grouped_all = df.groupby(['地域', '製品']).sum()
print("すべての数値列を合計(DataFrameを返す):")
print(grouped_all)

実行結果:

原始销售数据:
  地区  产品   销售额   数量
0  华北   A   1000    10
1  华东   B   2000    20
2  华南   C   1500    15
3  华北   B   1800    18
4  华东   A   2200    22
5  华南   C   1600    16
6  华北   A   1200    12
7  华东   B   2100    21

按地区和产品分组后的总计:
   地区  产品   销售额   数量
0  华东   A   2200    22
1  华东   B   4100    41
2  华南   C   3100    31
3  华北   A   2200    22
4  华北   B   1800    18

对所有数值列求和(返回DataFrame):
              销售额  数量
地区 产品
华东 A    2200   22
     B    4100   41
华南 C    3100   31
华北 A    2200   22
     B    1800   18

コードの解説:

  • ['地域', '製品']リストを使用して複数の列で同時にグループ化できます。
  • as_index=Falseの場合、結果はDataFrame形式になり、グループ化列は通常の列として保持されます。
  • 列を指定しない場合(例:.sum())、すべての数値列に対して合計が計算されます。

例3:min_countパラメータの使用

min_countパラメータは、グループ化して合計する際に必要な有効値の最小数を制御します。グループ内の有効値がこの数より少ない場合、NaNを返します。

実例

import pandas as pd
import numpy as np

# 欠損値を含むデータを作成
data = {
    '部門': ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'],
    '給与': [5000, 6000, np.nan, 7000, np.nan, np.nan, 8000, 9000, 10000]
}
df = pd.DataFrame(data)

print("従業員の給与データ(欠損値を含む):")
print(df)
print()

# デフォルトでは、sum() はNaN値を無視して合計します
sum_default = df.groupby('部門')['給与'].sum()
print("デフォルトの合計(NaNを無視):")
print(sum_default)
print()

# min_count=3を設定し、少なくとも3つの有効値がある場合のみ合計を実行
sum_min_count = df.groupby('部門')['給与'].sum(min_count=3)
print("min_count=3 の場合の合計結果:")
print(sum_min_count)
print()

# min_count=2 を設定
sum_min_count2 = df.groupby('部門')['給与'].sum(min_count=2)
print("min_count=2 の場合の合計結果:")
print(sum_min_count2)

実行結果:

员工工资数据(包含缺失值):
  部门     工资
0  A  5000.0
1  A  6000.0
2  A     NaN
3  B  7000.0
4  B     NaN
5  B     NaN
6  C  8000.0
7  C  9000.0
8  C  10000.0

默认求和(忽略NaN):
部门
A    11000.0
B     7000.0
C    27000.0
dtype: float64

min_count=3 时的求和结果:
部门
A    11000.0
B         NaN
C    27000.0
dtype: float64

min_count=2 时的求和结果:
部门
A    11000.0
B     7000.0
C    27000.0
dtype: float64

コードの解説:

  • デフォルトでは、sum()NaN値を無視し、有効値のみ合計します。
  • min_count=3各グループに少なくとも3つの有効値がある場合のみ合計を計算し、それ以外の場合はNaNを返すことを示します。
  • 部門Aには2つの有効値(5000と6000)があり、min_count=3を満たさないためNaNを返します。部門Cには3つの有効値があるため、正常に合計できます。

注意事項:sum()デフォルトではNaN値を無視して合計します。これは日常的に理解されている「空値」の処理と同じです。NaNを0とみなしてから合計する必要がある場合は、まずfillna(0)メソッドで欠損値を埋めることができます。


Pandas よく使う関数

その他の拡張