Python 在dataframe中添加批次行的总和

Python 在dataframe中添加批次行的总和,python,pandas,Python,Pandas,如果我有一个DataFrame,如何根据另一列的值一致(?)来计算一列N行的总和 数据帧示例: C1 C2 C3 0 400 F 31 1 10 F 32 2 300 F 33 3 100 Kn 29 4 3000 Kn 28 5 200 Kn 26 6 10 F 30 7 5000 F 34 8 30000 Kn 28 9 30000 Kn 26 现在,复杂的部分是,在C2名

如果我有一个DataFrame,如何根据另一列的值一致(?)来计算一列N行的总和

数据帧示例:

      C1  C2  C3
0    400   F  31
1     10   F  32
2    300   F  33
3    100  Kn  29
4   3000  Kn  28
5    200  Kn  26
6     10   F  30
7   5000   F  34
8  30000  Kn  28
9  30000  Kn  26
现在,复杂的部分是,在C2名称更改之前,我需要具有相同C2名称的C1行的总和。首先是三个F的和,然后是三个Kn的和,然后是两个F的和,等等

示例输出的示例:

      C1  C2  C3    sum
0    400   F  31    
1     10   F  32    
2    300   F  33    710
3    100  Kn  29   
4   3000  Kn  28   
5    200  Kn  26   3300
6     10   F  30   
7   5000   F  34   5010
8  30000  Kn  28  
9  30000  Kn  26  60000

我可以使用
df.loc[df['C2']='F']
根据C2值检索所有行,但是我只能得到所有F行的总和,这不是我想要的

我怎样才能得到每个F值的和,直到Kn出现,然后得到Kn值的和,直到F出现,等等


我很难构造出有意义的问题,请随意提出如何改进措辞的想法。

我们可以使用
cumsum
shift
根据
C2
中的变化计算创建自定义组。然后我们在
GroupBy.sum
中使用这些组来获得所需的列:

grps = df['C2'].ne(df['C2'].shift()).cumsum()
df['sum'] = df.groupby(grps)['C1'].transform('sum')

对@Erfan优雅回答的一点补充。要删除组中除最后一项之外的总和值,可以在groupby完成后执行此操作:

df.loc[~df['C2'].ne(df['C2'].shift(-1)), "sum"] = np.nan

df
Out[30]: 
      C1  C2  C3      sum
1    400   F  31      NaN
2     10   F  32      NaN
3    300   F  33    710.0
4    100  Kn  29      NaN
5   3000  Kn  28      NaN
6    200  Kn  26   3300.0
7     10   F  30      NaN
8   5000   F  34   5010.0
9  30000  Kn  28      NaN
9  30000  Kn  26  60000.0

其中
.shift(-1)
将序列向后移动1。

这看起来非常好,正是我所需要的!你对我如何获取求和值有什么想法吗?比如,我可以轻松检索
F_batch1:710、Kn_batch1:3300、F_batch2:5010或类似的格式?
df.loc[~df['C2'].ne(df['C2'].shift(-1)), "sum"] = np.nan

df
Out[30]: 
      C1  C2  C3      sum
1    400   F  31      NaN
2     10   F  32      NaN
3    300   F  33    710.0
4    100  Kn  29      NaN
5   3000  Kn  28      NaN
6    200  Kn  26   3300.0
7     10   F  30      NaN
8   5000   F  34   5010.0
9  30000  Kn  28      NaN
9  30000  Kn  26  60000.0