pandas分割、应用和组合(groupby)

import numpy as np
import pandas as pd


groupby对象

df1 = pd.DataFrame({'key':['A','B','C','A','B','C'],'data':range(6)},columns=['key','data'])
df1.groupby('key').sum()
# 将所有的列都进行求和,所以生成的是DataFrame

结果1

按列取值

df1.groupby('key')['data'].sum()

在这里插入图片描述

df1.groupby('key')['data'].describe()
# 可以直接调用方法

在这里插入图片描述


groupby对象可以按组迭代

for (m,g) in df1.groupby('key'):
    print(m,g)

在这里插入图片描述


累计、过滤、转换和应用

rng = np.random.RandomState(0)
df = pd.DataFrame({'key':['A','B','C','A','B','C'],
                  'data1':range(6),
                  'data2':rng.randint(0,10,6)},
                 columns=['key','data1','data2'])

在这里插入图片描述

累计

df.groupby('key').aggregate(['min',np.median,max])
# aggregate函数中可以指定多个统计方法,用列表传入进去

在这里插入图片描述

df.groupby('key').aggregate({'data1':sum,'data2':'max'})
# 也可以指定不同列,不同的统计方法,将一个列名为键,统计方法为值的字典传入进去

在这里插入图片描述

过滤

# 可以编写一个过滤函数,或者写一个lambda表达式用于过滤
# 传入的参数是每一组的数据
def filter_func(x):
    return x['data2'].std()>4
f = lambda x:x['data2'].std()>4
# 分组之后,组内data2值的标准差要大于4

print(df);print(df.groupby('key').std())

df.groupby('key').filter(f)
# 返回一个过滤后的DataFrame

在这里插入图片描述

转换

df.groupby('key').transform(lambda x:x-x.mean())

在这里插入图片描述

apply方法

def norm(x):
    x['data1'] /= x['data2'].sum()
    return x
df.groupby('key').apply(norm)

在这里插入图片描述

转换transform方法,和apply方法类似,transform是将所有的列都带入指定的方法处理,apply而是将整个DataFrame带入,处理指定的列

df.groupby('key').apply(lambda x:x-x.mean())
df.groupby('key').transform(lambda x:x-x.mean())
# 结果相同


apply和filter中传入的方法的区别

apply中的方法,输入的是分组数据的DataFrame,返回的是pandas对象或者标量,用于替换/添加数据

filter中的方法,输入的是分组数据的DataFrame,返回的是一个布尔类型的数据,用于过滤数据



设置分割的键

上面的分组都是以一列进行分割的,groupby还支持多种分组方式

将列表、数组、Series或者索引作为分组键

# 根据指定列表进行分组
l = [0,1,0,1,2,0]
print(df)
df.groupby(l).aggregate([sum,np.std])

在这里插入图片描述

# 指定Series来进行分组
df.groupby(df.key).sum()

在这里插入图片描述


用字典或Series将索引映射到索引名称

df=df.set_index('key')
mapp = {'A':'V','B':'Y','C':'Y'}

df.groupby(mapp).aggregate(sum)
# 默认是根据索引传进去进行分组

在这里插入图片描述



任意的python函数

df.groupby(str.lower).sum()
# 默认是根据索引传进去进行分组

在这里插入图片描述



多个有效键构成的列表

df.groupby([str.lower,l]).sum()
# 按照索引的小写,和l列表进行分组

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

努力生活的黄先生

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

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

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

打赏作者

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

抵扣说明:

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

余额充值