在没有级别参数的多级索引上使用 pandas 方法



我一直在浏览有关多级索引的 Pandas 文档,但我遇到了一个问题:

如果我有一个多级索引,并且想对索引的特定级别应用操作,如果该方法没有level参数,我不确定我将如何执行此操作。

下面是一个示例:

index = pd.MultiIndex.from_product([['A', 'B', 'C'], pd.date_range(start='1/1/2020', end='1/7/2020').tolist()], names=['Item', 'Date'])
series = pd.DataFrame(np.random.randn(21), index=index, columns=['Value'])

假设我想标准化我的值,以便它们在Item级别具有平均值 0 和标准 dev 1,我可以通过以下方式相当轻松地做到这一点:

series -= series.mean(level=0)
series /= series.std(level=0)

这是相当微不足道的,因为这两个操作都有level参数。 现在分配给ABC的行都有 0 均值和标准 dev 1。 但是,许多重要的操作没有能力做到这一点,我不确定是否有一种直接的方法,或者是否需要更复杂的分组/合并操作。

例如,如果我想使用pct_changediff()之类的方法,或者其他无法在多级索引上本机工作的方法,我该怎么办?

谢谢。

对于未内置级别的方法,可以在感兴趣的级别上使用 groupby 操作:

series.groupby(level=0)['Value'].diff()

对于您的 df 将返回:

>>> series.groupby(level=0)['Value'].diff()
Item  Date
A     2020-01-01         NaN
2020-01-02    0.607607
2020-01-03   -1.468150
2020-01-04   -0.342008
2020-01-05    1.292499
2020-01-06   -1.043734
2020-01-07   -1.390667
B     2020-01-01         NaN
2020-01-02   -1.102930
2020-01-03   -0.152588
2020-01-04   -0.079328
2020-01-05    0.976470
2020-01-06   -1.706948
2020-01-07    0.758684
C     2020-01-01         NaN
2020-01-02    0.543588
2020-01-03   -1.056940
2020-01-04    0.575442
2020-01-05   -0.894942
2020-01-06    0.403182
2020-01-07   -1.281761

您可以尝试将操作应用于 groupby 对象。

在您给出的示例中

series.mean(level=0)

相当于

series.groupby("Item").mean()

或者,更一般地说,

series.groupby("Item").apply(np.mean)

请注意,最后一个变体可能会对性能产生重要影响。

我不知道这是否适用于你想到的情况。

最新更新