【问题标题】:Grouping monthly data in a dataframe to show row sub-totals将数据框中的月度数据分组以显示行小计
【发布时间】:2022-10-04 16:10:33
【问题描述】:

我有下表,其中 Date 是索引列:

Date ColA ColB
2021-01-01 10 40
2021-01-02 20 15
2022-01-01 10 40
2022-01-02 20 15

我想添加行小计以显示年度总和:

Date ColA ColB
2021-01-01 10 40
2021-01-02 20 15
2021 Subtotal 30 55
2022-01-02 20 15
2021-01-02 20 15
2022 Subtotal 40 30

我尝试了以下代码:

df.groupby(level='Date').transform("sum")

但是我收到以下错误:
DateFormatError:无效日期“2022 小计”

有什么替代方法可以达到类似的结果?

【问题讨论】:

  • 您的索引是日期时间格式
  • “2022 Subtotal”为字符串,其余为数据格式。使用前将“'DATA”列中的所有项目更改为字符串。
  • 我建议你每年做一次,而不是改变你的日期时间格式
  • 我怎样才能做年度总和?我刚开始学习python。

标签: python


【解决方案1】:

您可以使用:

# grouper for years
# convert to datetime and extract year
# convert to string and add ' Subtotal'
group = (pd.to_datetime(df['Date']).dt.year
         .astype(str)
         .add(' Subtotal')
         )

# perform groupby.sum using the above grouper
# concatenation with original data
# sorting by year to move the subtotals below their respective data
out = (pd.concat(
       [df,
        df.groupby(group)
          .sum().reset_index()])
         .sort_values(by='Date',
                      key=lambda x: x.str.extract('(d+)', expand=False)
                      )
)

输出:

            Date  ColA  ColB
0     2021-01-01    10    40
1     2021-01-02    20    15
0  2021 Subtotal    30    55
2     2022-01-01    10    40
3     2022-01-02    20    15
1  2022 Subtotal    30    55

【讨论】:

  • 谢谢!这太棒了。能否请您也带我了解一下代码在做什么?
  • 我添加了更多的 cmets,我建议您尝试运行各个部分以查看其工作原理。如果您有具体问题,请告诉我!
猜你喜欢
  • 2020-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-14
  • 1970-01-01
相关资源
最近更新 更多