Python pandas中apply函数简介以及用法详解
作者:独影月下酌酒 发布时间:2022-05-11 03:44:47
1.基本信息
? Pandas 的 apply()
方法是用来调用一个函数(Python method),让此函数对数据对象进行批量处理。Pandas 的很多对象都可以使用 apply()
来调用函数,如 Dataframe、Series、分组对象、各种时间序列等。
2.语法结构
? apply()
使用时,通常放入一个 lambda
函数表达式、或一个函数作为操作运算,官方上给出DataFrame的 apply()
用法:
DataFrame.apply(self, func, axis=0, raw=False, result_type=None, args=(), **kwargs)
参数:
func:函数或 lambda 表达式,应用于每行或者每列
axis:{0 or ‘index’, 1 or ‘columns’}, 默认为0
0 or ‘index’: 表示函数处理的是每一列
1 or ‘columns’: 表示函数处理的是每一行
raw:bool 类型,默认为 False;
False ,表示把每一行或列作为 Series 传入函数中;
True,表示接受的是 ndarray 数据类型;
result_type:{‘expand’, ‘reduce’, ‘broadcast’, None}, default None
These only act when axis=1 (columns):
‘expand’ : 列表式的结果将被转化为列。
‘reduce’ : 如果可能的话,返回一个 Series,而不是展开类似列表的结果。这与 expand 相反。
‘broadcast’ : 结果将被广播到 DataFrame 的原始形状,原始索引和列将被保留。
args: func 的位置参数
**kwargs:要作为关键字参数传递给 func 的其他关键字参数,1.3.0 开始支持
返回值:
Series 或者 DataFrame:沿数据的给定轴应用 func 的结果
Objects passed to the function are Series objects whose index is either the DataFrame's index (``axis=0``) or the DataFrame's columns(``axis=1``).
传递给函数的对象是Series对象,其索引是DataFrame的索引(axis=0)或DataFrame的列(axis=1)。
By default (``result_type=None``), the final return type is inferred from the return type of the applied function. Otherwise,it depends on the `result_type` argument.
默认情况下( result_type=None),最终的返回类型是从应用函数的返回类型推断出来的。否则,它取决于' result_type '参数。
注:DataFrame与Series的区别与联系:
区别:
series,只是一个一维结构,它由index和value组成。
dataframe,是一个二维结构,除了拥有index和value之外,还拥有column。
联系:
dataframe由多个series组成,无论是行还是列,单独拆分出来都是一个series。
3.使用案例
3.1 DataFrame使用apply
官方使用案例
import pandas as pd
import numpy as np
df = pd.DataFrame([[4, 9]] * 3, columns=['A', 'B'])
df
A B
0 4 9
1 4 9
2 4 9
# 使用numpy通用函数 (如 np.sqrt(df)),
df.apply(np.sqrt)
'''
A B
0 2.0 3.0
1 2.0 3.0
2 2.0 3.0
'''
# 使用聚合功能
df.apply(np.sum, axis=0)
'''
A 12
B 27
dtype: int64
'''
df.apply(np.sum, axis=1)
'''
0 13
1 13
2 13
dtype: int64
'''
# 在每行上返回类似列表的内容
df.apply(lambda x: [1, 2], axis=1)
'''
0 [1, 2]
1 [1, 2]
2 [1, 2]
dtype: object
'''
# result_type='expand' 将类似列表的结果扩展到数据的列
df.apply(lambda x: [1, 2], axis=1, result_type='expand')
'''
0 1
0 1 2
1 1 2
2 1 2
'''
# 在函数中返回一个序列,生成的列名将是序列索引。
df.apply(lambda x: pd.Series([1, 2], index=['foo', 'bar']), axis=1)
'''
foo bar
0 1 2
1 1 2
2 1 2
'''
# result_type='broadcast' 将确保函数返回相同的形状结果
# 无论是 list-like 还是 scalar,并沿轴进行广播
# 生成的列名将是原始列名。
df.apply(lambda x: [1, 2], axis=1, result_type='broadcast')
'''
A B
0 1 2
1 1 2
2 1 2
'''
其他案例:
import numpy as np
import pandas as pd
df = pd.DataFrame({'A': [1, 2, 3],
'B': [4, 5, 6],
'C': [7, 8, 9]},
index=['a', 'b', 'c'])
df
ABC
a147
b258
c369
# 对各列应用函数 axis=0
df.apply(lambda x: np.sum(x))
A 6
B 15
C 24
dtype: int64
# 对各行应用函数
df.apply(lambda x: np.sum(x), axis=1)
a 12
b 15
c 18
dtype: int64
3.2 Series使用apply
官网案例
s = pd.Series([20, 21, 12],index=['London', 'New York', 'Helsinki'])
s
'''
London 20
New York 21
Helsinki 12
dtype: int64
'''
# 定义函数并将其作为参数传递给 apply,求值平方化。
def square(x):
return x ** 2
s.apply(square)
'''
London 400
New York 441
Helsinki 144
dtype: int64
'''
# 通过将匿名函数作为参数传递给 apply
s.apply(lambda x: x ** 2)
'''
London 400
New York 441
Helsinki 144
dtype: int64
'''
# 定义一个需要附加位置参数的自定义函数
# 并使用args关键字传递这些附加参数。
def subtract_custom_value(x, custom_value):
return x - custom_value
s.apply(subtract_custom_value, args=(5,))
'''
London 15
New York 16
Helsinki 7
dtype: int64
'''
# 定义一个接受关键字参数并将这些参数传递
# 给 apply 的自定义函数。
def add_custom_values(x, **kwargs):
for month in kwargs:
x += kwargs[month]
return x
s.apply(add_custom_values, june=30, july=20, august=25)
'''
London 95
New York 96
Helsinki 87
dtype: int64
'''
# 使用Numpy库中的函数
s.apply(np.log)
'''
London 2.995732
New York 3.044522
Helsinki 2.484907
dtype: float64
'''
3.3 其他案例
import pandas as pd
# 显示所有列
pd.set_option('display.max_columns', None)
# 显示所有行
pd.set_option('display.max_rows', None)
# 设置value的显示长度为100,默认为50
pd.set_option('max_colwidth', 100)
# 用来计算日期差的包
import datetime
def dataInterval(data1, data2):
"""
Args:
:param data1: datetime
:param data2: datetime
:return: delta days
"""
d1 = datetime.datetime.strptime(data1, '%Y-%m-%d')
d2 = datetime.datetime.strptime(data2, '%Y-%m-%d')
delta = d1 - d2
return delta.days
def getInterval(arrLike):
"""
Args:
:param arrLike: DataFrame
:return: delta days
"""
PublishedTime = arrLike['PublishedTime']
ReceivedTime = arrLike['ReceivedTime']
days = dataInterval(PublishedTime.strip(), ReceivedTime.strip())
return days
def getInterval_new(arrLike, before, after):
"""
Args:
:param arrLike: DataFrame
:param before: forward time
:param after: backwar time
:return: delta days
"""
before = arrLike[before]
after = arrLike[after]
days = dataInterval(after.strip(), before.strip())
return days
if __name__ == '__main__':
df = pd.read_excel('./data/NS_info.xls')
print(df.head())
# method 1
df['TimeInterval'] = df.apply(getInterval, axis=1)
print(df.head())
# method 2
df['TimeInterval'] = df.apply(getInterval_new,axis=1,
args=('ReceivedTime', 'PublishedTime'))
# method 3
df['TimeInterval'] = df.apply(getInterval_new,axis=1,
**{'before': 'ReceivedTime', 'after': 'PublishedTime'})
# method 4
df['TimeInterval'] = df.apply(getInterval_new,axis=1, before='ReceivedTime', after='PublishedTime')
4.总结
1.apply方法都是通过传入一个函数或者lambda表达式对数据进行批量处理
2.apply方法处理的都是一个Series对象
参考链接:
1.https://blog.csdn.net/missyougoon/article/details/83301712
2.https://blog.csdn.net/qq_19528953/article/details/79348929
来源:https://blog.csdn.net/weixin_44852067/article/details/122364306
猜你喜欢
- 由于javascript是一种无类型语言,所以一个数组的元素可以具有任意的数据类型,同一个数组的不同元素可以具有不同的类型,数组的元素设置可
- 1. isset功能:判断变量是否被初始化 说明:它并不会判断变量是否为空,并且可以用来判断数组中元素是否被定义过
- 简述Motivation一般来说,每个部分的内容数量是较为容易获取的,但比例(百分数)这样的数据是二次数据,这样的操作很常见比例的信息相比于
- 作为入门者来说,了解JavaScript中timer的工作方式是很重要的。通常它们的表现行为并不是那么地直观,而这是因为它们都处在一个单一线
- 最近使用vscode进行前端编程,遇到一些问题网上说明的不是很明显,故记录一下 1.开vscode使用CTRL+`或者点击查看到集成终端打开
- QMainWindowQMainWindow类中比较重要的方法方法描述addToolBar()添加工具栏centralWidge()返回窗口
- 如下所示:函数说明type()返回数据结构类型(list、dict、numpy.ndarray 等)dtype()返回数据元素的数据类型(i
- JQuery Solar System 是一个用JQuery写的东西,效果真是cool ! 没想到使用Javascript 也可以做到这种效
- 计是一个输入-输出的过程,因为首先有用户的需求,客户的项目才有设计的产生,设计是带有目的性和市场行为的,当然也有一部分的创造性设计,仅仅为了
- PHP异步调用实现方式 浏览器和服务器之间只一种面向无连接的HTTP协议进行通讯的,面向无连接的程序的特点是客户端请求服务端,服务端根据请求
- 一、套接字套接字是为特定网络协议(例如TCP/IP,ICMP/IP,UDP/IP等)套件对上的网络应用程序提供者提供当前可移植标准的对象。它
- 学习https://matplotlib.org/gallery/index.html 记录,描述不一定准确,具体请参考官网Matplotl
- 一、题目1.主题:逻辑回归2.描述:假设你是某大学招生主管,你想根据两次考试的结果决定每个申请者的录取机会。现有以往申请者的历史数据,可以此
- 目标打包Python selenium 自动化脚本(如下run.py文件)为exe执行文件,使之可以直接在未安装python环境的windo
- 这个项目到一开始的kickoff到现在,持续了很长的一段时间,现在差不多也接近了尾声,所以要好好做个总结,下面不会设计到太多技术层面上的东西
- Oracle分页存储过程的思路于sqlserver的思路是一样的,但是我这里做了点改动,在因为Oracle的语法和规则的不同所以,Oracl
- 这个代码不是很完善,能实现基本的功能;另外有个问题,就是divOpenWin层的定位问题:发现如果其属性设置成display:none,那么
- 本文实例讲述了Python单向链表和双向链表原理与用法。分享给大家供大家参考,具体如下:链表是一种数据结构,链表在循环遍历的时候效率不高,但
- 在写代码过程中,经常遇到一行代码很长的情况。为了让代码显得整齐干净,就需要把一行代码分成多行来写,Python中有两种小技巧可以实现该功能:
- 最近做了一个项目,其中有项目需求涉及到手机号验证码,就是当用户点击获取验证码之后我们会发送一条信息到用户手机,然后就会出现一个倒计时按钮,很