【问题标题】:Is there a more efficient way to call functions with different arguments multiple times?有没有更有效的方法来多次调用具有不同参数的函数?
【发布时间】:2017-05-07 03:45:09
【问题描述】:

目前我有以下函数遍历 Pandas DataFrame (df) 列并创建计数:

def my_function(my_argument):
    count = 0
    for i, row in df.iterrows(): 
        if row['MyColumn'] == my_argument:
            count += row['MyScore']
    return count

我有很多参数要分配给/调用函数 - 现在,我正在执行以下操作:

c = my_function('My_String1')
p = my_function('My_String13')
l = my_function('My_String342')
d = my_function('My_String14')
a = my_function('My_String49')
t = my_function('My_String553')
q = my_function('My_String42')
e = my_function('My_String99')
x = my_function('My_String123')
... ETC...

这样做,效果很好,但是我想知道是否有更实用/更有效的方法可以达到相同的结果。

我正在考虑添加变量名称,例如cpld 等到一个列表并形成某种循环 - 如果甚至可以工作......

因此,也许有点像:

for variable_name in list_of_variables:
    # ??? ... But I'm unaware of what would go here.

或者,有没有使用 Pandas 的方法?

【问题讨论】:

  • 这有时很难设置,但请查看 DataFrame applyapplymap 函数。 (在直接 Python 中,您只需使用 map(function, [arg-set-1, arg-set-1, arg-set-3]) 或列表理解 [function(x) for x in (arg-set-1, arg-set-2, arg-set-3),但 numpy/pandas 也有自己的版本,如果他们使用 numpy/pandas 数学无论如何可能会更快(如果他们不是,常规地图可能就可以了)。
  • 如果您使用 pandas 并且正在循环播放,那么大多数时候您的做法是错误的。 Pandas 为您节省了循环。
  • @doctorlove 介意发布一个例子吗? - 我已经看过并且老实说很难理解我将如何使用它来实现我的结果。非常感谢您的回答:-)
  • @MohammadYusufGhazi 谢谢。虽然,我并不特别了解如何使用它来提供相同的结果。

标签: python python-2.7 loops pandas for-loop


【解决方案1】:

Pandas 有一个内置方法 value_counts,它的工作原理类似于 groupby,但如果你只想要计数,它会跳过不需要的东西:

import pandas as pd
df = pd.DataFrame({'x':['a','b','c','d','a','a']})
df.x.value_counts()


a    3
b    1
d    1
c    1
Name: x, dtype: int64

### using groupby:

df.groupby('x').size()

x
a    3
b    1
c    1
d    1
dtype: int64

从那里,您可以过滤掉那些您不想计算的值(或在 value_counts() 调用之前进行)。

【讨论】:

  • 感谢您的示例!但是,我如何才能将其与我的答案联系起来,如我的函数中所展示的那样?因为这似乎只是为相同字符串的存在创建一个计数。然而,我想为来自不同列的不同字符串创建一个计数。更具体地说,正如我的函数所示:对于 row['MyColumn'] 等于参数,正在创建与存储在 row['MyScore'] 中的整数相对应的计数
  • 类似:df.groupby('x').agg(lambda x: np.sum(x.score))
  • 完美!谢谢 :) 最后,如何使用上一行的结果添加一个新列,因为目前它似乎替换了数据框中的所有值?
  • 类似:df.merge(df.groupby('x').agg(lambda x: np.sum(x.score)), left_on = 'x', right_index = True)
  • 谢谢,虽然这似乎不起作用,但它以非常随机的顺序重复整数和列:/
【解决方案2】:

我建议你试试 DataFrame 支持的groupby

但如果您更喜欢调用自定义函数,我建议将函数参数添加到数组中,例如 stringList = ["My_String1", "My_String13", ..]

stringList = ["My_String1", "My_String13", ".."]
results = map(my_function, stringList)

map 使用列表 stringList 中的每个项目迭代调用 my_function 函数

返回值将存储在results 列表中。

【讨论】:

  • 感谢您的建议!效果很好。如果您可以使用groupby 编辑您的答案以包含与我的答案相关的方法,我将非常感激 - 我已经看过并且老实说很难理解我将如何使用它来实现我的结果。
【解决方案3】:

您可以将结果存储在dict 而不是局部变量中。然后你可以很容易地使用循环:

results = {}
for var, n in (('c', 1),
               ('p', 13),
               ('l', 342),
              ):
    results[var] = my_function('My_String%d' % n)

【讨论】:

    【解决方案4】:
    map(lambda x: my_function(x), list_of_variables)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-08
      • 1970-01-01
      • 1970-01-01
      • 2021-02-06
      • 1970-01-01
      • 2017-09-06
      • 2020-04-19
      • 2011-12-26
      相关资源
      最近更新 更多