表的页边距仅垂直聚合

2024-04-26 11:24:50 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑数据文件:

df = pd.DataFrame(
    {'last_year': [1, 2, 3], 'next_year': [4, 5, 6]}, 
    index=['foo', 'bar', 'star']
)
      last_year  next_year
foo           1          4
bar           2          5
star          3          6

我正在寻找一种简单的方法来显示此表的列和行总计。

我的想法是通过.pivot_table()来实现:

pd.pivot_table(
    df,
    index=df.index,
    margins=True,
    aggfunc=sum
)

但是,这仅适用于第一个轴(垂直):

      last_year  next_year
bar           2          5
foo           1          4
star          3          6
All           6         15

我错过了什么?为什么像在this documentation's example中一样,不计算行总计?还有,为什么它会打乱我的索引顺序

我对df['All'] = df.sum(axis=1)类解决方案不感兴趣;我想要一种不影响原始数据帧的动态方法。数据透视表似乎是实现这一点的最合乎逻辑的方法(据我所知),但也许还有更好的方法


Tags: 方法dfindexfootablebarallyear
3条回答

我的猜测是,每一列在pivot_table中都是它自己的组,所以你看不到水平聚合(聚合一个元素是毫无意义的)。为了证明差异,请考虑^ {CD2>}:

(df.stack().reset_index(name='value')
   .pivot_table(index='level_0', columns='level_1', values='value', margins=True,
               aggfunc='sum')
) 

输出:

level_1  last_year  next_year  All
level_0                           
bar              2          5    7
foo              1          4    5
star             3          6    9
All              6         15   21

也就是说,这很可能是一个bug

pivot_table中不指定valuescolumns参数时。它将使用values的所有列。因为您只指定了index参数,所以其余的列last_yearnext_year被用作聚合的值。也就是说,您想对last_yearnext_year列的值应用sum函数

由于df的所有列都用于values参数,因此pivot_table不会将任何内容透视到列(轴=1)。因此,它没有理由在axis=1上执行margins

试试这个样品

Out[132]:
      last_year  next_year
foo           1          4
bar           2          5
star          3          6
bar          33         66

pd.pivot_table(df, index=df.index, margins=True, aggfunc=sum)

Out[134]:
      last_year  next_year
bar          35         71
foo           1          4
star          3          6
All          39         81

因此,pivot_table对两列last_year和每组index应用求和,将bar3571求和,最后计算轴=0上的margins。没有旋转到轴=1,因此它不会在轴=1上执行margins

要查看pivot_table使用values参数的所有列,您可以尝试使用此命令查看keyerror

pd.pivot_table(df, index=df.index, margins=True, aggfunc={'last_year': sum})

.....
    220                     grand_margin[k] = getattr(v, aggfunc)()
    221                 elif isinstance(aggfunc, dict):
--> 222                     if isinstance(aggfunc[k], compat.string_types):
    223                         grand_margin[k] = getattr(v, aggfunc[k])()
    224                     else:

KeyError: 'next_year'

对aggfunc使用dict时,pivot_tablevalues参数中的每一列传递给dict以获得相应的aggfunc。如上所述,我没有在dict中指定列next_year。因此,当pivot_表在dict中查找其aggfunc时,它返回keyrerror

我不知道这是否有帮助,但我对列和行进行了切换,以便进行合计。对于改进的代码,您能否更深入地解释动态方法?谢谢,我希望这对你有帮助

df43 = pd.DataFrame(
{'last_year': [1, 2, 3], 'next_year': [4, 5, 6]}, 
index=['foo', 'bar', 'star'])
df43 = df43.T #.T is transpose
df43['total'] = df43.sum(axis=1)
df43

相关问题 更多 >