应用带有多个参数的函数来创建新的pandas列

我想通过对两个现有列应用函数来在pandas数据帧中创建一个新列。遵循这个回答,当我只需要一个列作为参数时,我已经能够创建一个新列:

import pandas as pd
df = pd.DataFrame({"A": [10,20,30], "B": [20, 30, 10]})


def fx(x):
return x * x


print(df)
df['newcolumn'] = df.A.apply(fx)
print(df)

然而,当函数需要多个参数时,我不知道如何做同样的事情。例如,我如何通过将列a和列B传递给下面的函数来创建一个新列?

def fxy(x, y):
return x * y
315177 次浏览

这就解决了问题:

df['newcolumn'] = df.A * df.B

你还可以:

def fab(row):
return row['A'] * row['B']


df['newcolumn'] = df.apply(fab, axis=1)

你可以用@greenAfrican的例子,如果你可以重写你的函数的话。但是如果你不想重写你的函数,你可以在apply里面把它包装成一个匿名函数,像这样:

>>> def fxy(x, y):
...     return x * y


>>> df['newcolumn'] = df.apply(lambda x: fxy(x['A'], x['B']), axis=1)
>>> df
A   B  newcolumn
0  10  20        200
1  20  30        600
2  30  10        300

或者,你可以使用numpy底层函数:

>>> import numpy as np
>>> df = pd.DataFrame({"A": [10,20,30], "B": [20, 30, 10]})
>>> df['new_column'] = np.multiply(df['A'], df['B'])
>>> df
A   B  new_column
0  10  20         200
1  20  30         600
2  30  10         300

或者在一般情况下向量化任意函数:

>>> def fx(x, y):
...     return x*y
...
>>> df['new_column'] = np.vectorize(fx)(df['A'], df['B'])
>>> df
A   B  new_column
0  10  20         200
1  20  30         600
2  30  10         300

还有一个dict风格的干净语法:

df["new_column"] = df.apply(lambda x: x["A"] * x["B"], axis = 1)

或者,

df["new_column"] = df["A"] * df["B"]

如果你需要一次创建多个列:

  1. 创建数据帧:

    import pandas as pd
    df = pd.DataFrame({"A": [10,20,30], "B": [20, 30, 10]})
    
  2. Create the function:

    def fab(row):
    return row['A'] * row['B'], row['A'] + row['B']
    
  3. Assign the new columns:

    df['newcolumn'], df['newcolumn2'] = zip(*df.apply(fab, axis=1))
    

这将动态地给你想要的结果。即使你有两个以上的争论,它也能起作用

df['anothercolumn'] = df[['A', 'B']].apply(lambda x: fxy(*x), axis=1)
print(df)




A   B  newcolumn  anothercolumn
0  10  20        100            200
1  20  30        400            600
2  30  10        900            300