07数据聚合与分组运算

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fantacy10000/article/details/84640860

1.Groupy技术
核心思想:拆分-应用-合并
step1. pandas对象会根据你所提供的一个或多个键被拆分为多组;
step2. 将一个函数应用到各个分组并产生一个新值;
step3. 最后所有这些函数的执行结果会被合并到最终的结果对象中;

data=pd.DataFrame({'key1':['a','a','b','b','a'],'key2':['one','two','one','two','one'],'data1':np.random.randn(5),'data2':np.random.randn(5)})
print(data)
grouped=data['data1'].groupby(data['key1'])
这里的grouped对象很有意思,是一个GroupBy对象,直观上观察不了,可以理解为一个中间数据状态。
print(grouped.count())

data1 data2 key1 key2
0 0.685550 -0.340121 a one
1 0.077146 -0.971889 a two
2 -0.271265 -0.633583 b one
3 1.023990 0.305369 b two
4 -0.220377 -2.929215 a one

key1
a 3
b 2
Name: data1, dtype: int6

需要明确的是,这里的data[‘key1’]称为分组键,实际上分组键可以是任何长度适当的数组、列名、字典、函数等等。

2.数据聚合技术
所谓聚合,指的是任何能够从数组产生标量值的数据转换过程。

从具体实现角度而言:GroupBy会高效地对目标数据进行切片,然后对各片调用指定的聚合函数,最后将这些结果组装成最终结果。
2.1常用优化过的基本聚合函数:
    count()
    sum()
    mean()
    median()
    std、var()
    min()max()
    prod()
    first、last
2.2自己设计的聚合函数:
只需要将设计的聚合函数传入aggregate或agg方法即可:
def peak_to_peak(arr):
    return arr.max()-arr.min()
grouped.agg(peak_to_peak)
2.3面向列的多函数应用
首先要明确的一点,要用的函数所针对的数据是什么??
agg只负责调用目标函数,而前面基于groupby所选中的数据是作用的目标。
更具体的怎么理解?就是说基于不同分组键分层划分出的数据,是作为一个整体的数据块来应用目标函数。
比如前面分组键用了sex和smoker这两个,则相当于先基于sex,数据分为了male和female两类,而后各类基于somker,又分
为TrueFalse两个部分,这样的话,最初的整个数据被划分为4个数据块.那么后面利用agg引用的聚合函数将逐个作用在这4
个数据块中具体的指定列上!!
因此一个聚合函数将产生4个结果,分别对应4个数据块。

tips=pd.read_csv('ch08/tips.csv')
tips['tip_pct']=tips['tip']/tips['total_bill']
grouped=tips.groupby(['sex','smoker'])
grouped_pct=grouped['tip_pct']
grouped_pct.agg(['mean','std'])

注:对于产生的计算结果,可以采用自动给出的列名,这一般根据聚合函数的名字来确定,当然在传给agg过程中,可以指定列名。
grouped_pct.agg([('fol','mean'),('std_value','std')])

对于不同的列使用不同的聚合函数,则给agg传入字典形式即可:
grouped.agg({'tip':np.max,'size':'sum'})

3.分组级运算和转换

1.transform方法
key=['one','two','one','two','one']
people.groupby(key).mean()
people.groupby(key).transform(np.mean)
怎么理解transform??transform的作用是将一个函数应用到各个分组,然后将结果放置到合适的位置上:如果各分组产生的是
一个标量值,则该值将被广播出去。
通俗上解释,就是说对于前面基于groupby方法划分出的数据块,对每一个数据块施加同一个函数,然后针对结果的形式,可以将计算结果
自动放入合适的位置。需要注意的是,传入的函数是有严格要求的,其产生的结果只有两种,一种是一个可以广播的标量值,另一个是产生相同大小的结果数组。
2.apply:一般性的“拆分-应用-合并”
apply是最一般化的groupby方法,apply会将待处理的对象拆分成多个片段,然后对各片段调用传入的函数,最后尝试将各片段组合到一起。
tips.groupby('smoker').apply(top)

本质上,在GroupBy中,当你调用诸如describe之类的方法时,实际上只是应用了下面的快捷方式而已:
f=lambda x:x.describe()
grouped.apply(f)

猜你喜欢

转载自blog.csdn.net/fantacy10000/article/details/84640860