gpt4 book ai didi

python - 如何将变量从 for 循环传递到 pandas.df.apply 中的 kwargs?

转载 作者:太空宇宙 更新时间:2023-11-03 13:55:59 25 4
gpt4 key购买 nike

我在使用 df.apply 将变量传递给参数时遇到困难。我有一个函数,它拆分一个字符串,然后计算有多少子字符串与列表中的项目匹配。我正在将它应用于 pandas 数据框,使用 apply 传递要拆分的字符串和要在其中查找匹配项的列表。如果直接应用,这会起作用,但如果我尝试在 for 循环中传递此信息,则会失败,问题似乎是kwargs 不接受变量。

这是示例函数

def classification_counter(original, class_lists):
...: count=0
...: for y in original.split():
...: if y in class_lists:
...: count= count+1
...: return count

例如,这是我的列表,其中包含我稍后会查找的关键字:

bikes = ['raleigh', 'trek', 'cannondale']
cars = ['ford', 'bmw', 'vw']

我将遍历的列表:

class_set = ['cars', 'bikes']

这是我的数据框:

In [116]: df
Out[116]:
bikes cars texts
0 0 0 I like to drive my bmw
1 0 0 I like to ride my cannondale
2 0 0 I keep my trek on a rack on my vw
0 0 0 my wifes car is a vw mine is a bmw

如果我将应用应用于列,它会按预期工作:

In [119]:  df['cars']=df['texts'].apply(classification_counter, class_lists=cars)   

In [121]: df['bikes']=df['texts'].apply(classification_counter, class_lists=bikes)

In [122]: df
Out[122]:
bikes cars texts
0 0 1 I like to drive my bmw
1 1 0 I like to ride my cannondale
2 1 1 I keep my trek on a rack on my vw
0 0 2 my wifes car is a vw mine is a bmw

但是,如果我尝试遍历我的列表,它就会中断:

In [117]: for x in class_set:
...: df[x]=df['texts'].apply(classification_counter, class_lists=x)
...:

In [118]: df
Out[118]:
bikes cars texts
0 0 0 I like to drive my bmw
1 0 0 I like to ride my cannondale
2 0 1 I keep my trek on a rack on my vw
0 0 3 my wifes car is a vw mine is a bmw

关于将变量传递给关键字参数的正确方法,我是否遗漏了什么?

最佳答案

您不需要为此编写自己的“复杂”函数。使用 Pandas Series.str.count为此:

for col in class_set:
df[col] = df.texts.str.count('|'.join(eval(col)))

print(df)
bikes cars texts
0 0 1 I like to drive my bmw
1 1 0 I like to ride my cannondale
2 1 1 I keep my trek on a rack on my vw
3 0 2 my wifes car is a vw mine is a bmw

要使您自己的代码正常工作,请使用以下内容:

for x in class_set:
df[x]=df['texts'].apply(classification_counter, class_lists=eval(x))

但在 pandas 中,您总是希望使用矢量化解决方案,因为与自己定义的函数和 for 循环相比,它可以大大加快您的代码速度。

编辑解释
我们使用 '|'.join 来表示列表的字符串:

bikes = ['raleigh', 'trek', 'cannondale']

print('|'.join(bikes))
raleigh|trek|cannondale

并且我们使用 eval 因为您不能将您的变量作为字符串调用,我们必须为此使用 eval,因为您的 class_set 列出了字符串的 cotnains。但是我们想调用列表 bikescar 而不是字符串。

text = 'hello'

x = 'text'

print(eval(x))
hello

关于python - 如何将变量从 for 循环传递到 pandas.df.apply 中的 kwargs?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55499086/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com