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

Mic*_*ael 140 python 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)
Run Code Online (Sandbox Code Playgroud)

但是,当函数需要多个参数时,我无法弄清楚如何做同样的事情.例如,如何通过将列A和列B传递给下面的函数来创建新列?

def fxy(x, y):
    return x * y
Run Code Online (Sandbox Code Playgroud)

Rom*_*kar 196

您可以使用@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
Run Code Online (Sandbox Code Playgroud)

  • 事实上,这应该是“官方”答案。 (5认同)
  • 哇,似乎你是唯一一个没有专注于OP的极少数例子而是解决整个问题的人,谢谢,正是我需要的!:) (4认同)
  • 这是一个很好的技巧,它使列引用靠近apply调用(实际上在其中)。我使用了这个技巧和提供的多列输出技巧@toto_tico来生成3列输入,4列输出功能!很棒! (2认同)

alk*_*lko 123

或者,您可以使用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
Run Code Online (Sandbox Code Playgroud)

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

>>> 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
Run Code Online (Sandbox Code Playgroud)

  • 使用`np.vectorize()`的矢量化版本非常快.谢谢. (6认同)
  • 谢谢你的回答!我很好奇,这是最快的解决方案吗? (2认同)
  • 很好的解决方案!如果有人想知道向量化对于字符串比较函数也能很好并且超级快地工作。 (2认同)

gre*_*can 34

这解决了这个问题:

df['newcolumn'] = df.A * df.B
Run Code Online (Sandbox Code Playgroud)

你也可以这样做:

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

df['newcolumn'] = df.apply(fab, axis=1)
Run Code Online (Sandbox Code Playgroud)

  • 这个答案解决了这个玩具示例,并且足以让我重写我的实际函数,但它没有解决如何应用先前定义的函数而不将其重写为引用列. (7认同)
  • 请注意,矢量化操作(第一个代码示例)比带有“apply”的代码示例具有更好的性能。 (2认同)

tot*_*ico 19

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

  1. 创建数据框:

    import pandas as pd
    df = pd.DataFrame({"A": [10,20,30], "B": [20, 30, 10]})
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建功能:

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

    df['newcolumn'], df['newcolumn2'] = zip(*df.apply(fab, axis=1))
    
    Run Code Online (Sandbox Code Playgroud)


Sur*_*rya 13

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

df["new_column"] = df.apply(lambda x: x["A"] * x["B"], axis = 1)
Run Code Online (Sandbox Code Playgroud)

要么,

df["new_column"] = df["A"] * df["B"]
Run Code Online (Sandbox Code Playgroud)