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

你可能感兴趣的:(python,pandas,按行列聚合,汇总行)