Python 是否可以在pandas中使用自定义筛选功能?

Python 是否可以在pandas中使用自定义筛选功能?,python,pandas,Python,Pandas,我是否可以使用我的助手函数来确定快照是否是熊猫中的三指针过滤函数?我的实际函数要复杂得多,但为了这个问题我简化了它 def为三(x,y): 返回(x+y==3) 打印数据[isThree(数据['x'],数据['y'])。头() 在这种情况下,我建议使用np.where()。请参见以下示例: import pandas as pd import numpy as np df = pd.DataFrame({'x': [1,2,4,2,3,1,2,3,4,0], 'y': [0,1,2,0,0,

我是否可以使用我的助手函数来确定快照是否是熊猫中的三指针过滤函数?我的实际函数要复杂得多,但为了这个问题我简化了它

def为三(x,y):
返回(x+y==3)
打印数据[isThree(数据['x'],数据['y'])。头()

在这种情况下,我建议使用
np.where()
。请参见以下示例:

import pandas as pd
import numpy as np

df = pd.DataFrame({'x': [1,2,4,2,3,1,2,3,4,0], 'y': [0,1,2,0,0,2,4,0,1,2]})

df['3 Pointer'] = np.where(df['x']+df['y']==3, 1, 0)
收益率:

   x  y  3 Pointer
0  1  0          0
1  2  1          1
2  4  2          0
3  2  0          0
4  3  0          1
5  1  2          1
6  2  4          0
7  3  0          1
8  4  1          0
9  0  2          0

可以使用np.vectorize。文件在这里


是的,只要函数返回具有相同索引的布尔序列,就可以使用输出对原始数据帧进行切片。在这个简单的示例中,我们可以将
Series
传递给您的函数:

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randint(0, 4, (30, 2)))
def isThree(x, y):
    return x + y == 3

df[isThree(df[0], df[1])]
#    0  1
#2   2  1
#5   2  1
#9   0  3
#11  2  1
#12  0  3
#13  2  1
#27  3  0
是的:

输出:

   x  y
0  1  2
1  2  1
2  2  1
3  1  2
4  2  1
5  2  1
6  2  1
7  2  1
8  2  1
9  2  2
   x  y
0  1  2
1  2  1
2  2  1
3  1  2
4  2  1
输出:

   x  y
0  1  2
1  2  1
2  2  1
3  1  2
4  2  1
5  2  1
6  2  1
7  2  1
8  2  1
9  2  2
   x  y
0  1  2
1  2  1
2  2  1
3  1  2
4  2  1

我看过了,但我的实际功能相当大,我希望能够重用它。我不认为lambda会起作用。apply中还有其他选项吗?使用numpy.vectorize,速度惊人。@JSells您永远不必使用
lambda
,事实上Guido显然想删除Python 3中的构造。您可以对使用完整函数定义创建的函数执行任何操作,您可以使用
lambda
,当然,除了使该函数匿名(这永远不会发生)。在任何情况下都要放入
。此处不需要应用
。这通常是最后一次-resort@KartikeyaSharma嗯,不,不是,它甚至在文档中指出“提供矢量化函数主要是为了方便,而不是为了性能。实现本质上是一个for循环。”这里的目标是对原始数据帧进行子集划分还是基于布尔值分配一些新列?这不应该是问题的答案“我的实际函数要复杂得多,但我为这个问题简化了它。”所以他基本上想使用其他函数。这准确地回答了手头的问题,并且给出了一个更复杂的函数,OP仍然没有给出具体的理由,即
np.where()
不够。同意@rahlf23,我看不出有什么理由不这样做valid@KartikeyaSharma是正确的。是否有方法在where调用中包含“isThree”?@JSells是的,与
isThree(数据['x'],数据['y']完全相同)
。布尔索引和
np.where
都接受布尔数组。这实际上并没有矢量化任何内容(就性能而言)。谢谢!这很有效,但是还有一种方法可以在不创建新列的情况下进行过滤吗?如果没有,这也很有效。@JSells在这里不使用
np.vectorize
。没有必要,操作已经矢量化了,这个函数本质上是用于-loop@JSells我看不到在不创建列的情况下进行筛选。我会如果这是您的最终目标,我建议您使用其他解决方案。同时,我建议您尝试一下,看看它的性能以及它如何为您工作!这看起来应该与我的代码一起工作谢谢!很高兴听到!
   x  y
0  1  2
1  2  1
2  2  1
3  1  2
4  2  1