繁体   English   中英

Python Pandas,应用功能

[英]Python Pandas, apply function

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

然而,这个pandas方法文档很少,我找不到如何使用它的示例,除了文档中的lame .apply(sq.rt) ...没有关于如何使用参数等的示例...

无论如何,这里有一个关于我尝试做的玩具示例。

在我的理解中, 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)

上面的例子返回一个空的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)

结果是:

          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

说明:

您正在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

apply函数时,需要该函数在列/行上返回该操作的结果。 你得到Nonemultiply不回来,明显。 也就是说, apply应该在特定值之间返回结果,而不是自己进行赋值。

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

正确的multiply函数:

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

df[3] = df.apply(multiply, 'columns')

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

df[3] = df[0]*df[1]

一般情况下,你应该尽可能避免apply ,因为它不仅仅是引擎盖下的环路。

Pandas Zen的规则之一是: always try to find a vectorized solution first

.apply(..., axis=1)没有矢量化!

考虑替代品:

In [164]: df.prod(axis=1)
Out[164]:
0    0.770675
1    0.539782
2    0.318027
3    0.597172
4    0.211643
dtype: float64

In [165]: df[0] * df[1]
Out[165]:
0    0.770675
1    0.539782
2    0.318027
3    0.597172
4    0.211643
dtype: float64

针对50.000行DF的时间:

In [166]: df = pd.concat([df] * 10**4, ignore_index=True)

In [167]: df.shape
Out[167]: (50000, 2)

In [168]: %timeit df.apply(multiply, axis=1)
1 loop, best of 3: 6.12 s per loop

In [169]: %timeit df.prod(axis=1)
100 loops, best of 3: 6.23 ms per loop

In [170]: def multiply_vect(x1, x2):
     ...:     return x1*x2
     ...:

In [171]: %timeit multiply_vect(df[0], df[1])
1000 loops, best of 3: 604 µs per loop

结论:使用.apply()作为最后的手段(即没有别的帮助)

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

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

df['multiply'] = df.apply(lambda row: row[0] * row[1], axis = 1)

它产生与@Andy相同的输出

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

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

df['multiply'] = df.apply(lambda row: multiply(row[0] ,row[1]), axis = 1)

增强性能 ”一节中的更多示例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM