我希望有一个函数返回一个索引对象,该对象可用于过滤pandas Series或DataFrame中的元素。除了False
值的矩阵之外,有没有办法返回可以用于切片的东西,并且总是会返回一个空的数据集?
我想将它用作mydata[runtime_filter(mydata)]
,其中runtime_filter
是在运行时确定的东西,所以我正在寻找一种不选择值的方法,而是作为切片对象,而不是布尔索引对象,可能很大。 (如果runtime_filter
需要选择某些值而不选择其他值,我无法避免使用布尔索引对象。)
例如,这可以选择所有数据:
def find_all(some_series):
return slice(None)
因此mydata[find_all(mydata)]
基本上等同于mydata[:]
。
有没有办法返回一些简单的返回空集的方法?
def find_none(some_series):
return ?????
(如果我真的关心数据,那么我需要返回一个布尔索引对象;例如,这将返回一个索引对象,对于大于7的值,该对象为True,否则为False:
def find_greater_than_7(some_series):
return some_series > 7
我可以使用mydata[find_greater_than_7(mydata)]
来提取数据的子集。)
答案 0 :(得分:2)
您可以尝试一个结尾位于其开始之前的切片,例如slice(2, 1)
。
答案 1 :(得分:1)
如果您使用df.loc
代替df[...]
,则返回空列表就足够了:
import numpy as np
import pandas as pd
def find_none(some_series):
return []
df = pd.DataFrame(np.random.random((5,4)))
print(df.loc[find_none('foo')])
打印
Empty DataFrame
Columns: [0, 1, 2, 3]
Index: []
答案 2 :(得分:0)
根据@BrenBarn和@ Zero的答案,我使用了这个:
class Everything(object):
def __call__(self, data):
return slice(None)
def __invert__(self):
return Nothing()
def __and__(self, other):
return other
def __or__(self, other):
return self
class Nothing(object):
def __call__(self, data):
return slice(0)
def __invert__(self):
return Everything()
def __and__(self, other):
return self
def __or__(self, other):
return other
然后我也可以使用像
这样的操作mydata[filter1 & ~filter2]
与Everything()
和Nothing()
兼容,作为其中一个过滤器。