【问题标题】:Python Pandas Cumulative Sum across columns and get the result in another new columnsPython Pandas 跨列累积总和并在另一个新列中获取结果
【发布时间】:2020-07-02 15:16:05
【问题描述】:

我有 col1-col10 的数据框,我想计算列之间的累积总和并在旅途中创建新列,即 cum_col1-cum_col10。我查看了 cumsum(),但这给出了最终的累积总和。如何在创建新列时实现累积和。

数据框看起来像:

id    col1 col2 col3 col4 col5 col6 col7 col8 col9 col10
1     5    5     5   5    0    0    1    4    3    3 
2     0    0     0   0    0    0    4    4    0    0 
3     0    1     2   3    0    0    0    5    6    0

预期结果:

id  cum_col1 cum_col2 cum_col3 cum_col4 cum_col5 cum_col6 cum_col7 cum_col8 cum_col9 cum_col10
1   5        10       15       20       20       20       21       25       28       31 
2   0        0        0        0        0        0        4        8        8        8 
3   0        1        3        6        6        6        6        11       17       17

生成数据帧的 DDL:

import pandas as pd

df = pd.DataFrame({'id': [1, 2, 3],
                   'col1': [5, 0, 0],
                   'col2': [5, 0, 1],
                   'col3': [5, 0, 2],
                   'col4': [5, 0, 3],
                   'col5' : [0, 0, 0],
                   'col6': [0, 0, 0],
                   'col7': [1, 4, 0],
                   'col8': [4, 4, 5],
                   'col9': [3, 0, 6],
                   'col10': [3, 0, 0]})

谢谢!

【问题讨论】:

    标签: python pandas cumsum


    【解决方案1】:

    你可以对每一行应用一个匿名函数:

    df = df.groupby('id').apply(lambda x: x.drop('id', axis=1).add_prefix('cum_').cumsum(axis=1).sum()).reset_index()
    

    add_prefix() 函数允许您为每个列名添加前缀。

    结果:

       id  cum_col1  cum_col2  cum_col3  ...  cum_col7  cum_col8  cum_col9  cum_col10
    0   1         5        10        15  ...        21        25        28         31
    1   2         0         0         0  ...         4         8         8          8
    2   3         0         1         3  ...         6        11        17         17
    

    【讨论】:

    • 谢谢@obchardon!有效。只是想澄清一下,为什么我们这里需要groupby。
    【解决方案2】:

    cumsum 方法可以解决问题,前提是您将id隐藏到索引中:

    df.set_index('id', append=True).cumsum(axis=1).rename(
        columns = lambda x: 'cum_' + x).reset_index(level='id')
    

    Ig 按预期给出:

       id  cum_col1  cum_col2  cum_col3  ...  cum_col7  cum_col8  cum_col9  cum_col10
    0   1         5        10        15  ...        21        25        28         31
    1   2         0         0         0  ...         4         8         8          8
    2   3         0         1         3  ...         6        11        17         17
    

    【讨论】:

      猜你喜欢
      • 2017-01-05
      • 2020-11-28
      • 2021-10-28
      • 2019-08-30
      • 1970-01-01
      • 1970-01-01
      • 2019-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多