如何使用多个参数在 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
我想定义一个函数,只要为特定列调用它,它就会应用于数据框。我不想在定义函数时对列名进行硬编码。下面是我的示例代码。 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