pandasで累積和・累積積(cumsum, cumprod, cummax, cummin)
pandasで累積和や累積積を生成するには、pandas.DataFrame
, Series
のcumsum()
, cumprod()
メソッドを使う。
- pandas.DataFrame.cumsum — pandas 1.1.1 documentation
- pandas.DataFrame.cumprod — pandas 1.1.1 documentation
cumsum()
, cumprod()
のほか、累積的に最大値・最小値を算出するcummax()
, cummin()
メソッドもある。
- pandas.DataFrame.cummax — pandas 1.1.1 documentation
- pandas.DataFrame.cummin — pandas 1.1.1 documentation
ここでは以下の内容について説明する。
- 累積和・累積積:
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()
メソッドが提供されている。