pandasで累積和・累積積(cumsum, cumprod, cummax, cummin)

Posted: | Tags: Python, pandas

pandasで累積和や累積積を生成するには、pandas.DataFrame, Seriescumsum(), cumprod()メソッドを使う。

cumsum(), cumprod()のほか、累積的に最大値・最小値を算出するcummax(), cummin()メソッドもある。

ここでは以下の内容について説明する。

  • 累積和・累積積: cumsum(), cumprod()
    • 基本的な使い方
    • 欠損値NaNの扱い: 引数skipna
  • そのほかの累積的処理: cummax(), cummin()

累積和・累積積はPythonの標準ライブラリitertoolsやNumPyの関数・メソッドでも生成可能。itertoolsでは任意の関数を累積的に適用できる。

累積和・累積積: cumsum(), cumprod()

基本的な使い方

以下のpandas.DataFrameを例とする。

import pandas as pd

print(pd.__version__)
# 1.0.5

df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}, index=['X', 'Y', 'Z'])
print(df)
#    A  B
# X  1  4
# Y  2  5
# Z  3  6

cumsum(), cumprod()いずれも、デフォルトでは列ごとに累積和・累積積が算出される。引数axis=1とすると行ごと。

print(df.cumsum())
#    A   B
# X  1   4
# Y  3   9
# Z  6  15

print(df.cumsum(axis=1))
#    A  B
# X  1  5
# Y  2  7
# Z  3  9
print(df.cumprod())
#    A    B
# X  1    4
# Y  2   20
# Z  6  120

print(df.cumprod(axis=1))
#    A   B
# X  1   4
# Y  2  10
# Z  3  18

pandas.Seriesでも同様にcumsum(), cumprod()メソッドが使える。

print(df['B'])
# X    4
# Y    5
# Z    6
# Name: B, dtype: int64

print(type(df['B']))
# <class 'pandas.core.series.Series'>

print(df['B'].cumsum())
# X     4
# Y     9
# Z    15
# Name: B, dtype: int64

print(df['B'].cumprod())
# X      4
# Y     20
# Z    120
# Name: B, dtype: int64

欠損値NaNの扱い: 引数skipna

欠損値NaNが含まれているpandas.DataFrameを例とする。

df_nan = pd.DataFrame({'A': [1, 2, 3], 'B': [4, float('nan'), 6]}, index=['X', 'Y', 'Z'])
print(df_nan)
#    A    B
# X  1  4.0
# Y  2  NaN
# Z  3  6.0

デフォルトでは、欠損値NaNはスキップされる。

print(df_nan.cumsum())
#    A     B
# X  1   4.0
# Y  3   NaN
# Z  6  10.0

引数skipna=Falseとすると欠損値NaNも処理される。NaNとの四則演算の結果はNaNとなるため、NaN以降の要素はすべてNaNとなる。

print(float('nan') + 4)
# nan

print(df_nan.cumsum(skipna=False))
#    A    B
# X  1  4.0
# Y  3  NaN
# Z  6  NaN

cumprod()でも同様。

print(df_nan.cumprod())
#    A     B
# X  1   4.0
# Y  2   NaN
# Z  6  24.0

print(df_nan.cumprod(skipna=False))
#    A    B
# X  1  4.0
# Y  2  NaN
# Z  6  NaN

例は省略するが、pandas.Seriesでも同様。

そのほかの累積的処理: cummax(), cummin()

累積的に最大値・最小値を算出するcummax(), cummin()メソッドもある。例えば、時系列データなどである時点までの最大値や最小値を算出するのに便利。

使い方はcumsum(), cumprod()と同じ。デフォルトは列ごと、引数axis=1とすると行ごととなる。

df2 = pd.DataFrame({'A': [1, 4, 2], 'B': [6, 3, 5]}, index=['X', 'Y', 'Z'])
print(df2)
#    A  B
# X  1  6
# Y  4  3
# Z  2  5

print(df2.cummax())
#    A  B
# X  1  6
# Y  4  6
# Z  4  6

print(df2.cummax(axis=1))
#    A  B
# X  1  6
# Y  4  4
# Z  2  5

print(df2.cummin())
#    A  B
# X  1  6
# Y  1  3
# Z  1  3

print(df2.cummin(axis=1))
#    A  B
# X  1  1
# Y  4  3
# Z  2  2

欠損値NaNの扱いもcumsum(), cumprod()と同じで、引数skipnaを指定可能。

df2_nan = pd.DataFrame({'A': [1, 4, 2], 'B': [6, float('nan'), 5]}, index=['X', 'Y', 'Z'])
print(df2_nan)
#    A    B
# X  1  6.0
# Y  4  NaN
# Z  2  5.0

print(df2_nan.cummax())
#    A    B
# X  1  6.0
# Y  4  NaN
# Z  4  6.0

print(df2_nan.cummax(skipna=False))
#    A    B
# X  1  6.0
# Y  4  NaN
# Z  4  NaN

print(df2_nan.cummin())
#    A    B
# X  1  6.0
# Y  1  NaN
# Z  1  5.0

print(df2_nan.cummin(skipna=False))
#    A    B
# X  1  6.0
# Y  1  NaN
# Z  1  NaN

例は省略するが、pandas.Seriesでも同様にcummax(), cummin()メソッドが提供されている。

関連カテゴリー

関連記事