[英]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.