是否有一个抽象切片对象可用于在pandas Series或DataFrame中返回空数据

时间:2017-09-26 18:23:46

标签: python pandas

我希望有一个函数返回一个索引对象,该对象可用于过滤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)]来提取数据的子集。)

3 个答案:

答案 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()兼容,作为其中一个过滤器。