python pandas:将带有参数的函数应用于一系列

2025-01-22 08:45:00
admin
原创
110
摘要:问题描述:我想将带有参数的函数应用于 python pandas 中的一系列:x = my_series.apply(my_function, more_arguments_1) y = my_series.apply(my_function, more_arguments_2) ... 文档描述了对 app...

问题描述:

我想将带有参数的函数应用于 python pandas 中的一系列:

x = my_series.apply(my_function, more_arguments_1)
y = my_series.apply(my_function, more_arguments_2)
...

文档描述了对 apply 方法的支持,但它不接受任何参数。是否有其他接受参数的方法?或者,我是否错过了一个简单的解决方法?

更新(2017 年 10 月): 请注意,由于这个问题最初被问到,所以 pandasapply()已经更新为处理位置和关键字参数,并且上面的文档链接现在反映了这一点,并展示了如何包含任一类型的参数。


解决方案 1:

新版本的 pandas允许你传递额外的参数(请参阅新文档)。因此,现在你可以执行以下操作:

my_series.apply(your_function, args=(2,3,4), extra_kw=1)

位置参数添加在系列元素之后。


对于旧版本的熊猫:

文档对此进行了清晰的解释。apply 方法接受一个应该只有一个参数的 Python 函数。如果您想传递更多参数,则应functools.partial按照 Joel Cornett 在其评论中的建议使用。

举个例子:

>>> import functools
>>> import operator
>>> add_3 = functools.partial(operator.add,3)
>>> add_3(2)
5
>>> add_3(7)
10

您还可以使用 传递关键字参数partial

另一种方式是创建一个 lambda:

my_series.apply((lambda x: your_func(a,b,c,d,...,x)))

但我认为使用partial更好。

解决方案 2:

步骤:

  1. 创建数据框

  2. 创建函数

  3. 在 apply 语句中使用函数的命名参数。

例子

x=pd.DataFrame([1,2,3,4])  

def add(i1, i2):  
    return i1+i2

x.apply(add,i2=9)

此示例的结果是数据框中的每个数字都将添加到数字 9。

    0
0  10
1  11
2  12
3  13

解释:

“add” 函数有两个参数:i1、i2。第一个参数是数据框中的值,第二个参数是我们传递给“apply”函数的值。在本例中,我们使用关键字参数“i2”将“9”传递给 apply 函数。

解决方案 3:

Series.apply(func, convert_dtype=True, args=(), **kwds)

args : tuple

x = my_series.apply(my_function, args = (arg1,))

解决方案 4:

apply您可以通过未命名参数(作为元组传递给参数)args或通过参数内部捕获为字典的其他关键字参数,将任意数量的参数传递给调用的函数kwds

例如,让我们构建一个函数,对于 3 到 6 之间的值返回 True,否则返回 False。

s = pd.Series(np.random.randint(0,10, 10))
s

0    5
1    3
2    1
3    1
4    6
5    0
6    3
7    4
8    9
9    6
dtype: int64

s.apply(lambda x: x >= 3 and x <= 6)

0     True
1     True
2    False
3    False
4     True
5    False
6     True
7     True
8    False
9     True
dtype: bool

这个匿名函数不太灵活。让我们创建一个带有两个参数的普通函数来控制我们想要的系列中的最小值和最大值。

def between(x, low, high):
    return x >= low and x =< high

我们可以通过传递未命名参数来复制第一个函数的输出args

s.apply(between, args=(3,6))

或者我们可以使用命名参数

s.apply(between, low=3, high=6)

或者两者兼而有之

s.apply(between, args=(3,), high=6)

解决方案 5:

大多数内容都在其他答案中涵盖,想重复一下您可能错过的内容,您需要在 args 元组中的参数后添加逗号,见以下示例:

df['some_column'].apply(function_name, args=(arg1 ,) #Here comma is necessary.

解决方案 6:

#sample dataframe

import pandas as pd

df1=pd.DataFrame({'a':[3,4,7],'b':[4,2,2]})

#my function

def add_some(p,q,r):return p+q+r

df2=df1[["a","b"]].apply(add_some, args=(3,2))

print(df2)

_ ab

0 8 9

1 9 7

2 12 7

解决方案 7:

您只需在参数后添加逗号,即可在整个列表上运行函数。示例如下。可以在集合上执行相同的过程。

df = {"name" : [2,3,4,6],
      
      "age" : [4,10, 30, 20]
      }

print("Before")
df = pd.DataFrame(df)

print(df)

def fun(a, b):
    for c in b:
        a +=c
    return a
[![enter image description here][1]][1]

listt = set([3,4,5])

print("After")
new = df.apply(fun, args = (listt,))
print(new)

结果

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2793  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1710  
  PLM系统在企业项目管理中扮演着至关重要的角色,尤其是在项目采购管理方面,能够通过一系列策略提升采购效率、降低成本并保障质量。通过深入解析相关策略,企业可以更好地利用PLM系统优化采购流程,实现项目的顺利推进与整体目标的达成。需求精准定义策略在项目采购中,明确需求是首要任务。PLM系统可助力企业精准定义采购需求。首先,...
plm是什么意思   0  
  在企业的运营过程中,跨部门数据共享一直是一个关键且颇具挑战的问题。不同部门之间由于业务差异、系统不兼容等多种因素,常常形成信息孤岛,导致数据无法顺畅流通,影响企业整体的决策效率和协同效果。而 PLM 系统作为一种先进的管理工具,为解决这一难题提供了有效的途径。通过其一系列强大的核心功能,能够打破部门之间的数据壁垒,实现...
plm系统   0  
  PLM(产品生命周期管理)项目涉及产品从概念设计到退役的全流程管理,其复杂性和长期性要求高效的项目进度管理工具。甘特图作为一种直观且实用的项目进度可视化工具,在PLM项目中发挥着关键作用。通过甘特图,项目团队成员能够清晰地了解项目任务的时间安排、进度状态以及各项任务之间的关系,从而更好地协调工作、分配资源,确保项目按计...
plm流程是什么   0  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用