繁体   English   中英

对 dataframe 行求和并将结果放在下一行

[英]Sum dataframe rows and put the result in the next row

我有一个像这样的 dataframe:

    col1    col2      col3    col4
0    A       A_1       8        4
1    A       A_2       2        7
2    A       A_3       5        5
3    A       A_sum
4    B       B_1       9        8
5    B       B_2       6        8
6    B       B_3       5        2
7    B       B_sum

我想对 col3 和 col4 中属于 A 或 B 的行求和,并将总和放在索引 3 和 7 中,然后有一个像这样的输出数据框:

    col1    col2      col3    col4
0    A       A_1       8        4
1    A       A_2       2        7
2    A       A_3       5        5
3    A       A_sum     15       16
4    B       B_1       9        8
5    B       B_2       6        8
6    B       B_3       5        2
7    B       B_sum     20       18

已编辑:谢谢@andrej,它与上面的 df 完美配合,但在下面的这个中:

    col1    col2      col3    col4
0    A       A_1       8        4
1    A       A_2       NaN      7
2    A       A_3       NaN      5
3    A       A_sum     NaN      NaN
4    B       B_1       9        8
5    B       B_2       6        8
6    B       B_3       5        NaN
7    B       B_sum     NaN      NaN

当我尝试您的解决方案@andrej 时,它给了我这个 output:

    col1    col2      col3    col4
0    A       A_1       8        4
1    A       A_2       8        7
2    A       A_3       8        5
3    A       A_sum     8        16
4    B       B_1       9        8
5    B       B_2       6        8
6    B       B_3       5        16
7    B       B_sum     20       16

有没有办法只为索引 3 和 7 设置总和值?

尝试:

# if the empty values aren't NaNs already:
# df = df.replace("", np.nan) 

vals = df.groupby("col1").sum()
df = df.set_index("col1")
df.update(vals, overwrite=False)
print(df.reset_index())

印刷:

  col1   col2  col3  col4
0    A    A_1   8.0   4.0
1    A    A_2   2.0   7.0
2    A    A_3   5.0   5.0
3    A  A_sum  15.0  16.0
4    B    B_1   9.0   8.0
5    B    B_2   6.0   8.0
6    B    B_3   5.0   2.0
7    B  B_sum  20.0  18.0

编辑:

m = ~df.col2.str.contains("_sum")
df.loc[m] = df[m].fillna(0)

vals = df.groupby("col1").sum()
df = df.set_index("col1")
df.update(vals, overwrite=False)
print(df.reset_index())

印刷:

  col1   col2  col3  col4
0    A    A_1   8.0   4.0
1    A    A_2   0.0   7.0
2    A    A_3   0.0   5.0
3    A  A_sum   8.0  16.0
4    B    B_1   9.0   8.0
5    B    B_2   6.0   8.0
6    B    B_3   5.0   0.0
7    B  B_sum  20.0  16.0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM