我想定义一个函数,它将索引返回到数据帧中。例如,我有
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',:]
切入数据帧,这将返回与索引A
和B
上的条件匹配的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)
相当于传递:
。不过,我只在您的虚拟数据集上进行了测试,因此值得对您的真实数据进行测试。