Python 具有多个可调用项的df.loc[]

Python 具有多个可调用项的df.loc[],python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,我想使用两个单独的可调用项(一个由用户提供,一个由param提供)在数据帧中进行查找。也可以接受:由一个可调用的过滤器和另一个使用显式语法的过滤器索引 这可能吗?我猜这可以通过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

我想使用两个单独的可调用项(一个由用户提供,一个由param提供)在数据帧中进行查找。也可以接受:由一个可调用的过滤器和另一个使用显式语法的过滤器索引

这可能吗?我猜这可以通过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]

当您将lambda
filter
作为
loc
参数传递时,您传递它就像传递对象函数一样,而不是作为该函数计算的结果

因此,您不能使用任何
逻辑运算符
组合多个函数,这与使用多个
逻辑
条件时发生的情况不同

在任何情况下,如果您想对数据帧使用异构条件(逻辑和功能),可以使用
loc
两次。正如你自己所建议的

# function
filter = lambda df: df['C1']==1
df.loc[(df['C2']>5)].loc[filter]

过滤器是一个函数。您需要通过
filter(df)
:尝试
df.loc[(df['C2']>5)和(filter(df))]
谢谢@Chris!这是在假设filter(df)==df.loc[filter]的情况下工作的。我还没有弄清楚这是否总是正确的。@MagO这个错误不是由索引方式引起的,而是由按位AND操作引起的。@Chris建议创建一个布尔掩码以避免
TypeError
@MagO另一个选项是创建一个包含可调用的:
df.loc[lambda x:filter(x)&(x['C2']>5)]
,它使用先前创建的可调用的