对于某个数据,我们经常需要各种聚合操作,比如针对行/列求和,求均值等。下面通过一个例子看在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.注意因为已经添加了一行总和,在后面求均值求方差时候需要将该行排除掉。
总结一下,按行列求和相对比较简单,只需找准指定数据对应位置即可。
先对数据分组,然后添加汇总结果行,也是我们常见应用场景,下面看个例子。
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