我有一个这样的数据帧:
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
我想对属于A或B的col3和col4中的行求和,并将和放在索引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时,它会给我这个输出:
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