在 pandas 中切片 MultiIndexed DataFrame

Slicing MultiIndexed DataFrame in pandas

我有以下 DataFrame 名为 pop:

California  2000    33871648
            2010    37253956
New York    2000    18976457
            2010    19378102
Texas       2000    20851820
            2010    25145561

我想打印出加利福尼亚州和德克萨斯州 2010 年的数值。每当我尝试 pop[['California','Texas'], 2010] 时,我都会遇到错误 '(['California', 'Texas'], 2010)' is an invalid key 那我怎么打印信息呢?

TLDR

df.loc[(level_1_indices_list, level_2_indices_list), :]

在这种情况下是:

df.loc[(['California','Texas'], ['2010']), :]

下面是更详尽的版本。


# import packages & set seed
import numpy as np
import pandas as pd
np.random.seed(42)

创建示例数据框

使用the Pandas docs:

arrays = [np.array(['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux']),
          np.array(['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two'])]

s = pd.Series(np.random.randn(8), index=arrays)

df = pd.DataFrame(np.random.randn(8, 4), index=arrays)

这看起来像:


使用多索引切片

使用 df 你可以:

df.loc[(['qux','foo'], 'one'), :]

为了符号的一致性,您可以在切片的第二个元素上使用 []

df.loc[(['qux','foo'], ['one']), :]

这将产生相同的结果。

即:

(选择 'one' 相当于在 df 中选择 2010['qux','foo'] 应该相当于选择 ['California' ,'Texas']。基于此,我认为您可以将此处的步骤应用于您的数据。)


也可能有帮助。

我想要指定列名,可以通过添加更多 &

来进一步扩展

df.loc[(df['level_0'].isin(['California', 'Texas'])) & (df['level_1'].isin(['2010']))]