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

2025-01-22 08:45:00
admin
原创
87
摘要:问题描述:我想将带有参数的函数应用于 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大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用