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



我想定义一个函数,每当为特定列调用数据帧时,该函数就会应用于数据帧。我不想在定义函数时对列名进行硬编码。下面是我的示例代码。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

我似乎错过了一些基本的东西。如何修改上面的代码使其工作?

除了命名参数外,您还可以遵循可选参数的**kwargs模式。为了进行演示,如果没有给出参数,则使用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

**args定义意味着要传递一个dict类对象以进行添加。如果要在强制X参数之后传递任意数量的值参数,则需要使用*args

在func中,您还需要将新列分配给数据帧,以便保存它。因此,给定

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

最新更新