Pandas:分组级的运算和转换--transform和apply

import numpy as np
import pandas as pd
from pandas import Series,DataFrame

一、介绍

聚集函数只是将一组值转换为一个标量值,其实还可以将更多类型的函数应用到分组上,下面的transform和apply就提供这样的功能。

二、transform

transform中传入的函数只能返回两种结果,可以广播的标量值或者与分组大小相同的结果数组。

df = DataFrame({'类别':['水果','水果','水果','蔬菜','蔬菜','肉类','肉类'],
                '产地':['美国','中国','中国','中国','新西兰','新西兰','美国'],
                '水果':['苹果','梨','草莓','番茄','黄瓜','羊肉','牛肉'],
               '数量':[5,5,9,3,2,10,8],
               '价格':[5,5,10,3,3,13,20]})
print(df)
    产地  价格  数量  水果  类别
0   美国   5   5  苹果  水果
1   中国   5   5   梨  水果
2   中国  10   9  草莓  水果
3   中国   3   3  番茄  蔬菜
4  新西兰   3   2  黄瓜  蔬菜
5  新西兰  13  10  羊肉  肉类
6   美国  20   8  牛肉  肉类

1.对分组求均值,然后把这个均值赋值给整个组(可广播的标量值)

print(df.groupby('类别').transform(np.mean))
          价格        数量
0   6.666667  6.333333
1   6.666667  6.333333
2   6.666667  6.333333
3   3.000000  2.500000
4   3.000000  2.500000
5  16.500000  9.000000
6  16.500000  9.000000

2.使用transform实现去均值(返回与分组大小相同的结果数组)

demean = lambda arr:arr-arr.mean()
print(df.groupby('类别').transform(demean))
         价格        数量
0 -1.666667 -1.333333
1 -1.666667 -1.333333
2  3.333333  2.666667
3  0.000000  0.500000
4  0.000000 -0.500000
5 -3.500000  1.000000
6  3.500000 -1.000000

三、apply

apply会将分组传递给函数,然后尝试将函数的返回结果组合起来。

def get_rows(df,n=1): # 返回分组的前n行数据
    return df.iloc[:n,:]
print(df.groupby('类别').apply(get_rows))
       产地  价格  数量  水果  类别
类别                       
水果 0   美国   5   5  苹果  水果
肉类 5  新西兰  13  10  羊肉  肉类
蔬菜 3   中国   3   3  番茄  蔬菜

为apply的函数传递参数

print(df.groupby('类别').apply(get_rows,n=2))
       产地  价格  数量  水果  类别
类别                       
水果 0   美国   5   5  苹果  水果
   1   中国   5   5   梨  水果
肉类 5  新西兰  13  10  羊肉  肉类
   6   美国  20   8  牛肉  肉类
蔬菜 3   中国   3   3  番茄  蔬菜
   4  新西兰   3   2  黄瓜  蔬菜
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BQW_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值