Python 是否有一个抽象的切片对象可用于返回熊猫系列或数据帧中的空数据

Python 是否有一个抽象的切片对象可用于返回熊猫系列或数据帧中的空数据,python,pandas,Python,Pandas,我想要一个函数,它返回一个索引对象,该对象可用于筛选熊猫系列或数据帧中的元素。除了False值矩阵之外,是否有方法返回可用于切片且始终返回空数据集的内容 我想将其用作mydata[runtime\u filter(mydata)]其中runtime\u filter是在运行时确定的,因此我正在寻找一种不选择值的方法,而是作为切片对象,而不是布尔索引对象,它可能很大。(如果runtime\u filter需要选择一些值,而不是其他值,我无法避免布尔索引对象。) 例如,这可用于选择所有数据: def

我想要一个函数,它返回一个索引对象,该对象可用于筛选熊猫系列或数据帧中的元素。除了
False
值矩阵之外,是否有方法返回可用于切片且始终返回空数据集的内容

我想将其用作
mydata[runtime\u filter(mydata)]
其中
runtime\u filter
是在运行时确定的,因此我正在寻找一种不选择值的方法,而是作为切片对象,而不是布尔索引对象,它可能很大。(如果
runtime\u 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_大于_7(mydata)]
来提取数据的子集。)

你可以尝试一个结束在开始之前的切片,比如
slice(2,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: []

基于@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()
兼容。

关于
some_系列呢!=有些_series
?@BrenBarn在series有
NaN时不起作用这也是一个简单的实现,但是如果series本身很大,它会返回一个巨大的对象,我希望应用一些简单的方法。使用
返回pd.series(False,index=some _series.index)
或者
返回片段(0)]
?我想说这是与@Zero的
切片(0)相同的概念。
是的,这是唯一似乎有效的东西,尽管它似乎有点错误,而且如果索引不是数字的,不确定它是否有效。@JasonS:我用非数字索引测试了它,它似乎有效。@JasonS
pd.DataFrame(np.one((4,4)),list('abcd'),list('wxyz'))[切片(0)]
切片索引。
切片(0)
更干净,但确实有效。谢谢!我试过了,但在数据帧上似乎不起作用。哦——是的,你得到了与我相同的结果;我想要的是生成一个空索引,而不是空列。
loc
比普通索引更好吗?@JasonS:我喜欢使用
df.loc
而不是
df
作为布尔的索引掩蔽。它不仅速度快了一点,还帮助我知道,每当我阅读
df[…]
时,它都在选择列,而不是行。@Zero:我想OP想要一个索引为空的数据帧。
df[…].index.empty
为假,但
df.loc[…].index.empty
为真。