我想使用两个单独的Callables(一个由用户提供,一个由param提供)在DataFrame中进行查找。也可以接受:使用显式语法按一个Callable和另一个过滤器进行索引。
这可能吗?我猜可以用groupby来完成,但这似乎有点麻烦。
最小代码示例:
import pandas as pd # Version: 0.23.4, Python 2.7
df = pd.DataFrame({'C1': [1, 2,1], 'C2': [3, 4, 10]})
# This works
filter = lambda adf: adf['C1']==1
df.loc[filter]
# So does this
df.loc[df['C2']>5]
# Both of them together works
df.loc[(df['C2']>5) & (df['C1']==1)]
# So why don't any of these?
df.loc[(df['C2']>5) & filter] #TypeError: ...
df.loc[(df['C2']>5) & (filter)] # TypeError: ...
df.loc[df['C2']>5 & filter] # TypeError: ...
filter2 = lambda adf: adf['C2']>5
df.loc[(filter) & (filter2)] # TypeError: ...
df.loc[(filter) | (filter2)] # TypeError: ...
# Nesting works, but isn't pretty for multiple callables
df.loc[(df['C2']>5)].loc[filter]
答案 0 :(得分:0)
当您将lambda filter
作为loc
参数传递时,您像对象函数一样传递它,而不是因为该函数的计算结果。
因此,与使用多个logical operator
条件时发生的情况不同,您不能使用任何logical
来组合多种功能。
在任何情况下,如果要使用异构标准(逻辑和功能)来过滤数据帧,则可以两次使用loc
。就像你自己建议的那样。
# function
filter = lambda df: df['C1']==1
df.loc[(df['C2']>5)].loc[filter]