文章目录
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就会被调用多少次
- series.apply(func)
- 需要注意的
- 自己定义一个函数, apply() 只需要传函数的名字不需要有括号
- 如果传入多个参数, 自定义函数的第一个参数 一定是用来接受pandas 传入的数据的
- 如果逻辑比较简