pandas 按行聚合 按列聚合 分组添加汇总行

1.dataframe按行列聚合

对于某个数据,我们经常需要各种聚合操作,比如针对行/列求和,求均值等。下面通过一个例子看在pandas中如何实现。

import pandas as pd


def t1():
    data = {
        'name': ['a', 'a', 'a', 'b', 'b', 'c', 'c', 'c'],
        's1': [1, 5, 4, 2, 4, 3, 6, 7],
        's2': [0.1, 0.5, 0.4, 0.2, 0.4, 0.3, 0.6, 0.7]
    }
    df = pd.DataFrame(data)
    df['merge'] = df[['s1', 's2']].sum(axis=1)

    df.loc['总和'] = df[['s1', 's2', 'merge']].sum()
    n = df.shape[0]
    index_array = [i for i in range(n-1)]
    df.loc['均值'] = df.loc[index_array].mean()
    df.loc['方差'] = df.loc[index_array].std()
    print(df)

上面代码实现了如下功能:
1.对于df将s1,s2的值相加,即逐行求和,并将结果命名为merge。
2.对于df,将s1,s2, merge分别按列求和,并且该行索引值为总和。
3.对于求均值求方差,与按列求和同理。
4.注意因为已经添加了一行总和,在后面求均值求方差时候需要将该行排除掉。

总结一下,按行列求和相对比较简单,只需找准指定数据对应位置即可。

2.分组添加汇总行

先对数据分组,然后添加汇总结果行,也是我们常见应用场景,下面看个例子。

def t2():
    data = {
        'name': ['a', 'a', 'a', 'b', 'b', 'c', 'c', 'c'],
        's1': [1, 5, 4, 2, 4, 3, 6, 7],
        's2': [0.1, 0.5, 0.4, 0.2, 0.4, 0.3, 0.6, 0.7]
    }
    df = pd.DataFrame(data)
    aggret = df.groupby('name', as_index=False).agg({'s1': 'sum', 's2': 'sum'})
    df = pd.concat([df, aggret]).reset_index(drop=True)
    df.sort_values(by='name', inplace=True)
    print(df)

上面代码实现的功能是,将数据按name分组,然后对s1,s2进行聚合做求和操作。

操作步骤如下:
1.先根据name做groupby操作,需要注意的点在于,将groupby函数中的as_index参数设为False,这样name将不会作为结果中的行索引。
2.将原有的df与aggret进行拼接,这样就将汇总行数据添加了进来。
3.对所得结果按name排序,这样得到的结果方便查看,汇总行数据在相同key数组分组的最下面一行。

最后得到的结果为:

   name  s1   s2
0     a   1  0.1
1     a   5  0.5
2     a   4  0.4
8     a  10  1.0
3     b   2  0.2
4     b   4  0.4
9     b   6  0.6
5     c   3  0.3
6     c   6  0.6
7     c   7  0.7
10    c  16  1.6
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值