220

我想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
4

6 回答 6

314

如果您可以重写您的函数,您可以使用@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
于 2013-11-12T06:52:41.130 回答
181

或者,您可以使用 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
于 2013-11-14T11:17:46.190 回答
53

这解决了问题:

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

你也可以这样做:

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

df['newcolumn'] = df.apply(fab, axis=1)
于 2013-11-11T20:17:21.430 回答
40

如果您需要一次创建多个列

  1. 创建数据框:

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

    def fab(row):                                                  
        return row['A'] * row['B'], row['A'] + row['B']
    
  3. 分配新列:

    df['newcolumn'], df['newcolumn2'] = zip(*df.apply(fab, axis=1))
    
于 2017-09-13T12:07:09.943 回答
18

另一种 dict 风格的简洁语法:

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

或者,

df["new_column"] = df["A"] * df["B"]
于 2016-05-01T19:54:52.790 回答
0

def fx(a, b): ... return a*b ... df['new_col'] = np.vectorize(fx)(df['A'], df['B']) df AB new_column 0 10 30 200 1 10 40 400 2 10 50 500

于 2022-01-01T15:10:09.807 回答