如何使用多个参数在 pandas 数据帧上调用函数

How to call a function on pandas dataframe with multiple argument

我想定义一个函数,只要为特定列调用它,它就会应用于数据框。我不想在定义函数时对列名进行硬编码。下面是我的示例代码。 lambda 函数可能很复杂,但我正在尝试使用一个简单的函数

def add(X, **args):
  for arg in args:
    X[arg].apply(lambda x: x + 10)
  return X

但是如果我像下面这样在我的函数上调用这个函数,我会收到错误消息,尽管我的数据框中有这些列。

y = add(df_final['ABC', 'XYZ'])

KeyError: ('ABC', 'XYZ')

我也试过像下面这样打电话

y = add(df_final, ['ABC', 'XYZ'])

TypeError: add() takes 1 positional argument but 2 were given

看来我在这里遗漏了一些基本的东西。如何修改以上代码使其生效?

**args 定义意味着要传递给 add 的类似字典的对象。如果您想在强制性 X 参数后传递任意数量的值参数,则需要使用 *args

在您的函数中,您还需要将新列分配给数据框,以便保存。所以,给定

def add(X, *args):
   for arg in args:
      X[arg] = X[arg].apply(lambda x: x + 10)
   return X

您将获得以下内容:

>>> df
    a   b  ABC  XYZ
0   1   1    6    1
1  34  34    5    2
2  34  34    4    4
3  34  34    3    5
4   d  23    2    6
5   2   2    1    7

df = add(df, *['ABC','XYZ'])

>>> df
    a   b  ABC  XYZ
0   1   1   16   11
1  34  34   15   12
2  34  34   14   14
3  34  34   13   15
4   d  23   12   16
5   2   2   11   17

除了命名参数之外,您还可以遵循可选参数的 **kwargs 模式。出于演示目的,如果未给出 source 参数,请使用 dest 作为应用于

的列
df = pd.DataFrame({"ABC":[r for r in range(10)], "XYZ":[r for r in range(10)]})

def add(X, dest="", **kwargs):
    c = dest if "source" not in kwargs else kwargs["source"]
        
    X[dest] = X[c].apply(lambda x: x +10)
    return X
 
df = add(df, dest="ABC")
df = add(df, dest="XYZ", source="ABC")
df = add(df, dest="new", source="XYZ")
df = add(df, dest="new", source="new")
df
print(df.to_string(index=False))

输出

 ABC  XYZ  new
  10   20   40
  11   21   41
  12   22   42
  13   23   43
  14   24   44
  15   25   45
  16   26   46
  17   27   47
  18   28   48
  19   29   49