我一直在浏览有关多级索引的 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
参数。 现在分配给A
、B
和C
的行都有 0 均值和标准 dev 1。 但是,许多重要的操作没有能力做到这一点,我不确定是否有一种直接的方法,或者是否需要更复杂的分组/合并操作。
例如,如果我想使用pct_change
或diff()
之类的方法,或者其他无法在多级索引上本机工作的方法,我该怎么办?
谢谢。
对于未内置级别的方法,可以在感兴趣的级别上使用 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)
请注意,最后一个变体可能会对性能产生重要影响。
我不知道这是否适用于你想到的情况。