【问题标题】:Sum dataframe rows and put the result in the next row对数据框行求和并将结果放在下一行
【发布时间】:2021-05-11 19:14:50
【问题描述】:

我有一个这样的数据框:

    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 时,它给了我这个输出:

    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 设置总和值?

【问题讨论】:

    标签: python python-3.x pandas dataframe python-requests


    【解决方案1】:

    试试:

    # 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
    

    【讨论】:

    • @ShivamRoy 这将按列“col1”分组并对 col3/col4 列求和。然后DataFrame.update() 将根据索引/列用这个总和更新所有NaNs(我们之前做过.set_index("col1")
    • @AndrejKesely 我编辑我的问题,你能检查一下你能不能解决这个问题?还有如何不打印 15.0 而只打印 15?提前致谢
    • 非常感谢@AndrejKesely,你是救生员。
    • @AndrejKesely 还有一件事,你知道如何打印,例如只有 8 而不是 8.0?我试过 int() 但是当我写 df.to_csv() 时,数字仍然有那个“.0”
    • @user14073111 你可以试试df.loc[:, 'col3':'col4'] = df.loc[:, 'col3':'col4'].astype(int)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    • 2020-12-26
    • 2019-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多