Python Pandas,套用功能

jim*_*iat 6 python pandas

我正在尝试使用apply来避免iterrows()函数中的迭代器:

但是该pandas方法的文档很少,除了.apply(sq.rt)文档中的the脚之外,我找不到如何使用它的示例。没有关于如何使用参数等的示例。

无论如何,这是我尝试做的一个玩具示例。

以我的理解,它apply实际上与相同iterrows(),即进行迭代(如果axis = 0,则在行上进行迭代)。在每次迭代x中,函数的输入应在行上进行迭代。但是,我不断收到的错误消息证明了这一假设。

grid = np.random.rand(5,2)
df = pd.DataFrame(grid)

def multiply(x):
    x[3]=x[0]*x[1]

df = df.apply(multiply, axis=0)
Run Code Online (Sandbox Code Playgroud)

上面的示例返回一个空的df。谁能说明我的误解?

And*_*ndy 5

import pandas as pd
import numpy as np

grid = np.random.rand(5,2)
df = pd.DataFrame(grid)

def multiply(x):
    return x[0]*x[1]

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

结果是:

          0         1  multiply
0  0.550750  0.713054  0.392715
1  0.061949  0.661614  0.040987
2  0.472134  0.783479  0.369907
3  0.827371  0.277591  0.229670
4  0.961102  0.137510  0.132162
Run Code Online (Sandbox Code Playgroud)

解释:

您正在使用的函数apply需要返回一个值。您还将它应用于每一行,而不是列。axis您传递的参数在这方面不正确。

最后,请注意我将它设置为等于'multiply'我函数之外的列。您可以轻松地将其更改为df[3] = ...您所拥有的,并获得如下所示的数据框:

          0         1         3
0  0.550750  0.713054  0.392715
1  0.061949  0.661614  0.040987
2  0.472134  0.783479  0.369907
3  0.827371  0.277591  0.229670
4  0.961102  0.137510  0.132162
Run Code Online (Sandbox Code Playgroud)


Jon*_*Jon 5

应该注意的是,您也可以使用 lambda 函数。查看他们的文档应用

对于您的示例,您可以运行:

df['multiply'] = df.apply(lambda row: row[0] * row[1], axis = 1)
Run Code Online (Sandbox Code Playgroud)

产生与@Andy相同的输出

如果您的函数采用以下形式,这可能会很有用

def multiply(a,b):
    return a*b

df['multiply'] = df.apply(lambda row: multiply(row[0] ,row[1]), axis = 1)
Run Code Online (Sandbox Code Playgroud)

增强性能部分中的更多示例


mir*_*ulo 1

apply使用函数时,您需要该函数返回对列/行的操作的结果。显然,你得到的是None因为multiply没有回报。也就是说,apply应该返回特定值之间的结果,而不是执行赋值本身。

您还在这里迭代了错误的轴。您当前的代码采用每列的第一个和第二个元素并将它们相乘。

正确的multiply函数:

def multiply(x):
    return x[0]*x[1]

df[3] = df.apply(multiply, 'columns')
Run Code Online (Sandbox Code Playgroud)

话虽如此,您可以比这里做得更好apply,因为它不是矢量化操作。只需直接将列相乘即可。

df[3] = df[0]*df[1]
Run Code Online (Sandbox Code Playgroud)

一般来说,您应该apply尽可能避免,因为它只不过是引擎盖下的一个循环本身。