使用冒号 (:) 运算符通过函数调用创建数据帧切片



我想定义一个函数,它将索引返回到数据帧中。例如,我有

import pandas as pd
df = pd.DataFrame({'A':['a', 'a', 'b'], 'B':[1,2,3], 'C':[1.1, 2.2 ,3.3]})
df = df.set_index(['A', 'B'])

然后,我可以通过df.loc['a',1]df.loc['a',:]切入数据帧,这将返回与索引AB上的条件匹配的C值。在第一种情况下,我会得到一个值,在第二种情况下,我会得到两个值。

与其每次都显式编写索引,我想定义一个自动生成它的函数。我的伪函数(不起作用)可能是,

def func(df, a, b=None):
if b is None:
b = ':'
return df.loc[a,b]

有了这个,我希望能够做一些类似func(df, 'a', 1)func(df, 'a', None)的事情,就像分别直接调用df.loc['a',1]df.loc['a',:]一样。

由于我的索引中有多个级别,如果传递给函数的参数None,则有一种定义:运算符的方法将非常有用。


更新:我在索引中有很多级别,即我想避免为我可能拥有的每个可能的None组合编写if语句。例如,假设我在索引中有四个级别。做这样的事情会很棒,

# Does not work
def func(df, a, b=None, c=None, d=None):
if b is None:
b = ':'
if c is None:
c = ':'
if d is None:
d = ':'
return df.loc[a,b,c,d]

而不是为参数中的每个None组合编写 if 语句(在本例中为 7)。

问题是您将':'作为字符串传递以与当前函数df.loc。这样的事情应该可以解决这个问题:

def func(df, a, b=None):
if b is None:
b = slice(None)
return df.loc[a, b]

我的理解是,在这里使用slice(None)相当于传递:。不过,我只在您的虚拟数据集上进行了测试,因此值得对您的真实数据进行测试。

最新更新