Python 在dataframe中添加批次行的总和
如果我有一个DataFrame,如何根据另一列的值一致(?)来计算一列N行的总和 数据帧示例: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名
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