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