【问题标题】:Running sum in a pandas pivot table (python)在熊猫数据透视表中运行 sum (python)
【发布时间】:2020-12-28 09:14:42
【问题描述】:

我有一个如下所示的数据框:

df = pd.DataFrame({'publisher': ['facebook', 'facebook', 'facebook', 'google', 'google', 'google'],
          'month_leadgen': ['2019-01', '2019-01', '2019-01', '2019-02', '2019-02', '2019-03'],
         'month_payment': ['2019-01', '2019-02', '2019-03', '2019-02', '2019-03', '2019-03'],
         'revenue': [60, 25, 45, 85, 90, 60]})

我创建了一个数据透视表:

df = df.pivot_table(index=['publisher', 'month_leadgen'], columns=['month_payment'], values=['revenue']).reset_index()

    publisher   month_leadgen   revenue
month_payment            2019-01  2019-02  2019-03
0   facebook    2019-01  60.0     25.0     45.0
1   google      2019-02  NaN      85.0     90.0
2   google      2019-03  NaN      NaN      60.0

我的预期输出是按月计算总和。因此,对于 facebook,我希望在 2019-02 列(第 1 个月 + 第 2 个月)中看到 85.0。 Facebook 的 2019-03 专栏将是 125.0(第 1 个月 + 第 2 个月 + 第 3 个月)。谢谢。

【问题讨论】:

  • 试试:df = df.pivot_table(index=['publisher', 'month_leadgen'], columns=['month_payment'], values=['revenue']).cumsum(axis=1).reset_index()

标签: python python-3.x pandas pivot-table


【解决方案1】:

让我们在axis=1 上尝试.cumsum()。那是cumsum(1)

df=df.join(df[['revenue']].cumsum(1).rename(columns=dict(revenue='Cumsum')))



publisher month_leadgen                     revenue                  Cumsum          \
month_payment                         2019-01 2019-02 2019-03   2019-01 2019-02   
0              facebook       2019-01    60.0    25.0    45.0    60.0    85.0   
1                google       2019-02     NaN    85.0    90.0     NaN    85.0   
2                google       2019-03     NaN     NaN    60.0     NaN     NaN   

                       
month_payment 2019-03  
0               130.0  
1               175.0  
2                60.0  

或者,在旋转阶段进行;

df2 = df=df.pivot_table(index=['month_leadgen','publisher'], columns=['month_payment'], values=['revenue']).cumsum(axis=1).reset_index()

【讨论】:

  • 对不起,我不清楚。我需要所有月份和所有出版商的 cumsum。我的真实数据长达 9 个月。
  • 为什么不能用九个月?你也可以试试df2 = df=df.pivot_table(index=['month_leadgen','publisher'], columns=['month_payment'], values=['revenue']).cumsum(axis=1).reset_index() df2
  • 好的,这最后一条评论很棒,而且很有效。我不能感谢你!你太棒了!
【解决方案2】:

只需以这种方式将您的数据集定义为发布者作为索引:

df = pd.DataFrame( { 'month_leadgen': ['2019-01', '2019-01', '2019-01', '2019-02', '2019-02', '2019-03'], 'month_payment': ['2019-01', '2019-02', '2019-03', '2019-02', '2019-03', '2019-03'], '收入': [60, 25, 45, 85, 90, 60] }, index = ['facebook', 'facebook', 'facebook', 'google', 'google', 'google'] )

然后执行执行这一行:

df['TotalShifted'] = df.groupby(level=0)['revenue'].transform(lambda x: x.cumsum().shift(0))

您将获得:

month_leadgen month_payment 收入 TotalShifted 脸书 2019-01 2019-01 60 60 脸书 2019-01 2019-02 25 85 脸书 2019-01 2019-03 45 130 谷歌 2019-02 2019-02 85 85 谷歌 2019-02 2019-03 90 175 谷歌 2019-03 2019-03 60 235

【讨论】:

    猜你喜欢
    • 2021-02-28
    • 2023-01-11
    • 2014-11-03
    • 2017-01-14
    • 2019-04-28
    • 2012-04-15
    • 1970-01-01
    • 2018-09-15
    相关资源
    最近更新 更多