自定义函数和Pandas分组操作

本文详细介绍了如何在Pandas中使用自定义函数和分组操作进行数据处理。首先,讨论了数据分析的基本思路和常用操作,如异常值和缺失值处理。然后,重点讲解了Series和DataFrame调用apply函数的应用,包括使用匿名函数和向量化函数。接着,阐述了Pandas的分组操作,如分组聚合、转换和过滤,以及DataFrameGroupby对象的使用。最后,提到了透视表API pivot_table和datetime数据类型的相关处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 数据分析/处理思路说明

模型 = 数据 + 算法

为什么要做数据处理, 主要掌握哪些操作

  • 不同的算法对要处理的数据的形式会有不同的要求

    • 异常值的处理
    • 缺失值的处理
    • 取值是连续的列 → 取值是类别型
    • 有些情况下一个用户对应着多条数据, 对于算法来讲, 一个用户就是一个样本, 一个样本只能有一条记录
    • 分组聚合操作, 每个用户的多条数据聚合成一条
  • 必须要掌握的操作

    • 筛选 按照不同的条件选出自己想要的数据 loc/iloc/布尔索引
    • 分组聚合
    • 缺失值处理
    • Apply 自定义函数
    • 多表关联

2 Apply自定义函数

pandas 自带的API不能满足需求的时候, 可以使用自定义函数来处理, apply 就是pandas提供的一种方便我们调用自定函数的API

如果没有apply 我们想对一列数据/一行数据做相同的处理时, 除了创建一个自定义函数之外还需要自己写for循环进行调用, 使用了apply这个API 就不需要for循环遍历

2.1 Series 调用Apply

series.apply(函数对象)

  • 这里传入的是函数对象的名字, 不需要写括号

函数第一个参数就是series中的每一个数据, 如果要传入多个参数可以通过如下方式调用

def my_exp(x,e):
    return x**e
df['a'].apply(my_exp,e =3)

2.2 DataFrame调用Apply

df.apply(函数对象, axis = 0/1)

默认是按列传, 自定义函数接收到的是一列数据 类型是Series

如果axis = 1, 自定义函数接收到的是一行数据 类型是Series

# 计算行的平均值
def avg_2(x):
    a = x[0]
    b = x[1]

    return (a+b)/2
# dataframe表中的平均值,每一行的平均值
df.apply(avg_2,axis=1)

2.3 向量化函数

将一个标量函数转换成一个向量函数np.vectorize(avg_2_mod)

使用场景:

@np.vectorize
def avg_2_mod(x,y):
    if x==20:
        return (np.NaN)
    else:
        return (x+y)/2
avg_2_mod(df['a'],df['b'])

if series == 20:
这里会将series 的每一个值跟20做比较, 返回一个由True/False组成的series

  • 默认情况下, 它会把 bool类型的series作为一个整体来给if 进行判断, 此时会报错

  • 如果想让series里的每一个值, 都跟20进行比较做多次的if判断, 需要把函数变成向量函数,或者在函数前面加上装饰器 np.vectorize

2.4 apply 使用匿名函数

匿名函数 lambda表达式, 自定义的处理逻辑比较简单、 一行代码就可以搞定时,没必要再def 定义一个有名字的函数, 可以直接使用lambda表达式来创建一个匿名函数

df.apply(lambda x: x**2+1)

x 在当前场景下 代表了一列数据

df.apply(lambda x: x**2+1, axis = 1)

当axis = 1 x 代表了一行数据

df[‘a’].apply (lambda x: x**2+1)

x 代表一个值

小结 ☆☆☆☆☆

  • 啥时候用 自带函数不能满足需求, 需要使用自定义函数
  • 怎么用
    • series.apply(func)
      • pandas会遍历series中的每一条数据, 将数据传递给func
      • series中有多少条数据 func就会被调用多少次
    • dataframe.apply(func)
      • axis 默认是0 按列传 也可以改成1 按行传
      • axis = 0 有多少列数据, func就会被调用多少次, axis = 1 有多少行数据, func就会被调用多少次
  • 需要注意的
    • 自己定义一个函数, apply() 只需要传函数的名字不需要有括号
    • 如果传入多个参数, 自定义函数的第一个参数 一定是用来接受pandas 传入的数据的
    • 如果逻辑比较简
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值