web-dev-qa-db-ja.com

Pandasデータフレーム-リセット付きのランニングサム

特定の列の現在の合計を計算したい(もちろん、ループを使用せずに)。注意点は、現在の合計をその行に存在する値にリセットするタイミングを指定するこの別の列があることです。次の例で最もよく説明されています。

   reset  val   desired_col
0      0    1   1
1      0    5   6
2      0    4   10
3      1    2   2
4      1   -1   -1
5      0    6   5
6      0    4   9
7      1    2   2

desired_colは計算したい値です。

21
Baron Yugovich

cumsum()を2回使用できます:

#   reset  val  desired_col
#0      0    1            1
#1      0    5            6
#2      0    4           10
#3      1    2            2
#4      1   -1           -1
#5      0    6            5
#6      0    4            9
#7      1    2            2
df['cumsum'] = df['reset'].cumsum()
#cumulative sums of groups to column des
df['des']= df.groupby(['cumsum'])['val'].cumsum()
print df
#   reset  val  desired_col  cumsum  des
#0      0    1            1       0    1
#1      0    5            6       0    6
#2      0    4           10       0   10
#3      1    2            2       1    2
#4      1   -1           -1       2   -1
#5      0    6            5       2    5
#6      0    4            9       2    9
#7      1    2            2       3    2
#remove columns desired_col and cumsum
df = df.drop(['desired_col', 'cumsum'], axis=1)
print df
#   reset  val  des
#0      0    1    1
#1      0    5    6
#2      0    4   10
#3      1    2    2
#4      1   -1   -1
#5      0    6    5
#6      0    4    9
#7      1    2    2
33
jezrael