Pandas groupby.sum() 関数
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)
# 販売データの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
コードの解説:
df.groupby('地区')['销售额']は、最初に"地域"列でグループ化してから、"売上高"列を選択して操作することを示します。.sum()各グループ内の売上高を合計します。- 返される結果は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)
# 販売データを作成
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)
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)メソッドで欠損値を埋めることができます。
その他の拡張