python数据分析——apply 1

参考资料:活用pandas库

apply是指把函数同时作用于DataFrame的每一行或每一列。类似于编写一些跨每行或每列的for循环,并同时调用apply函数。

1、函数

函数是对python代码进行分组和复用的一种方法。如果某段代码会被多次使用,并且使用时是需要做少量修改,这时就应该考虑把这段代码放入一个函数中。

python 复制代码
# 编写一个函数
# 求平方的函数
def my_sq(x):
    """
    求平方
    """
    return x**2

# 求平均数的函数
def my_avg(x,y):
    """
    求两个数的平均值
    """
    return(x+y)/2

三重引号中的文本是文档字符串。在查找某个函数的帮助文档时,就会看到它们。可以是使用这些文档字符串为自定的函数创建帮助文档。

2、使用函数

python 复制代码
# 导入库
import pandas as pd

# 创建一个DataFrame
df=pd.DataFrame({
    'a':[10,20,30],
    'b':[20,30,40]
})

(1)Series的apply方法

Series有一个apply方法。该方法有一个func参数。当传递给它一个函数之后,apply方法就会把传入的函数应用于Series的每个元素。

python 复制代码
# 把自定义的平方函数应用于列a
sq=df['a'].apply(my_sq)
print(sq)

请注意,当把my_sq传递给apply时,不要在my_sq后面加上圆括号。

当自定函数有多个参数时,系统会将Series数据分配给第一个参数。

python 复制代码
# 定义一个幂函数,包含两个参数
def my_exp(x,e):
    return x**e
# 当把my_exp函数应用于一个Series时,除了要把my_exp传递给apply之外,
# 还要多久传递一个参数,用于指定指数的大小。
# 传递改参数时,可以使用关键字参数。
ex=df['a'].apply(my_exp,e=3)
print(ex)

(2)DataFrame的apply方法

DataFrame通常有至少两个维度(或称字段/列)。因此,当向DataFrame应用一个函数时,首先需要指定应用该函数的轴,例如逐行或逐列。

如果把apply方法的axis参数设置为0(默认值),则表示按列应用指定函数。如果把axis参数设置为1,则按行应用指定函数。

当向DataFrame应用一个函数时(默认按列应用),这个轴(如列)会传递到函数的第一个参数中。

python 复制代码
# 自定义一个函数,它接收一个值,并将其输出。
def print_me(x):
    print(x)
    
# 按列应用,函数的第一个参数就是一个完整数据列,而不是一列的某个值
df.apply(print_me)

如下的应用函数则会报错:

python 复制代码
# 自定义一个函数,含有3个参数
def avg_3(x,y,z):
    return (x+y+z)/3
# 
df.apply(avg_3)

正确的函数应用应该是:

3、apply高级用法

python 复制代码
# 导入numpy库
import numpy as np
# 导入Titanic数据集
titanic=pd.read_csv(r"...\seaborn常用数据案例\titanic.csv")
# 查看数据集的基本信息
print(titanic.info())

# 编写函数
def count_missing(vec):
    """
    计算一个向量中缺失值的个数
    """
    # 根据值是否缺失获取一个由True/False值组成的向量
    null_vec=pd.isnull(vec)
    # 得到null_vec中的null值得个数
    # null值对应True,True为1,False为0
    null_count=np.sum(null_vec)
    # 返回向量中缺失值的个数
    return null_count

def prop_missing(vec):
    """
    计算向量中缺失值的占比
    """
    # 调用count_missing函数计算缺失值的个数
    num=count_missing(vec)
    # 获得向量中元素的个数
    dem=vec.size
    # 返回缺失值的占比
    return num/dem

def prop_complete(vec):
    """
    向量中非缺失值的占比
    """
    # 调用prop_missing函数计算缺失值的占比
    return 1-prop_missing(vec)

# 按列应用,用于对列的缺失数据情况进行分析
cmis_col=titanic.apply(count_missing)
pmis_col=titanic.apply(prop_missing)
pcom_col=titanic.apply(prop_complete)
print(cmis_col)
print(pmis_col)
print(pcom_col)

# 按行应用,用于行的缺失数据分析
cmis_row=titanic.apply(count_missing,axis=1)
pmis_row=titanic.apply(prop_missing,axis=1)
pcom_row=titanic.apply(prop_complete,axis=1)
print(cmis_row.head())
print(pmis_row.head())
print(pcom_row.head())
相关推荐
啟明起鸣3 分钟前
【Go 与云原生】先从 Go 对与云原生的依赖关系讲起,再讲讲 一个简单的 Go 项目热热身
开发语言·云原生·golang
oioihoii9 分钟前
《C语言点滴》——笑着入门,扎实成长
c语言·开发语言
B站_计算机毕业设计之家16 分钟前
深度学习:python人脸表情识别系统 情绪识别系统 深度学习 神经网络CNN算法 ✅
python·深度学习·神经网络·算法·yolo·机器学习·cnn
waves浪游31 分钟前
基础开发工具(下)
linux·运维·服务器·开发语言·c++
QX_hao43 分钟前
【Go】--log模块的使用
开发语言·后端·golang
爱编程的鱼1 小时前
ESLint 是什么?
开发语言·网络·人工智能·网络协议
小陈不好吃1 小时前
Spring Boot配置文件加载顺序详解(含Nacos配置中心机制)
java·开发语言·后端·spring
合作小小程序员小小店1 小时前
web网页开发,在线%聚类,微博,舆情%系统,基于python,pycharm,django,nlp,kmeans,mysql
python·pycharm·kmeans·聚类·sklearn·kmean
Dan.Qiao1 小时前
python读文件readline和readlines区别和惰性读
开发语言·python·惰性读文件
渡我白衣1 小时前
链接的迷雾:odr、弱符号与静态库的三国杀
android·java·开发语言·c++·人工智能·深度学习·神经网络