我正在尝试使用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。谁能说明我的误解?
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)
应该注意的是,您也可以使用 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)
增强性能部分中的更多示例
当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尽可能避免,因为它只不过是引擎盖下的一个循环本身。
| 归档时间: |
|
| 查看次数: |
2174 次 |
| 最近记录: |