pandas multiindex - 如何在使用列时选择第二级?

And*_*ore 30 python-3.x pandas

愚蠢的问题,但我真的找不到答案.我有一个包含此索引的数据框:

index = pd.MultiIndex.from_product([['stock1','stock2'...],['price','volume'...]])
Run Code Online (Sandbox Code Playgroud)

这是一个有用的结构df['stock1'],但我如何选择所有价格数据?我无法理解文档.

我试过以下没有运气: df[:,'price'] df[:]['price'] df.loc(axis=1)[:,'close'] df['price]

如果无论出于何种原因,这种索引风格一般都被认为是一个坏主意,那么什么是更好的选择呢?我应该将股票的多指数指数作为时间序列上的标签而不是列级别吗?

非常感谢

编辑 - 我使用multiindex作为列,而不是索引(措辞对我来说更好).文档中的示例侧重于多级索引而不是列结构.

And*_*w L 35

还使用John的数据样本:

使用xs()是切片的另一种方法MultiIndex:

df
               0
stock1 price   1
       volume  2
stock2 price   3
       volume  4
stock3 price   5
       volume  6

df.xs('price', level=1, drop_level=False)
              0
stock1 price  1
stock2 price  3
stock3 price  5
Run Code Online (Sandbox Code Playgroud)

或者,如果您有一个MultiIndex代替列:

df
  stock1        stock2        stock3       
   price volume  price volume  price volume
0      1      2      3      4      5      6

df.xs('price', axis=1, level=1, drop_level=False)
  stock1 stock2 stock3
   price  price  price
0      1      3      5
Run Code Online (Sandbox Code Playgroud)

  • 很好,谢谢.由于我是Multiindexing的新手,我的问题写得不好.我使用multiindex作为列,而不是索引.`df.xs('price',axis = 1,level = 1)`完美地完成工作 (2认同)
  • 只是在这里说 .xs 在 pandas 1.1.3 中仍在使用:https://pandas.pydata.org/pandas-docs/stable/user_guide/advanced.html (2认同)

Max*_*axU 30

使用@ JohnZwinck的数据样本:

In [132]: df
Out[132]:
               0
stock1 price   1
       volume  2
stock2 price   3
       volume  4
stock3 price   5
       volume  6
Run Code Online (Sandbox Code Playgroud)

选项1:

In [133]: df.loc[(slice(None), slice('price')), :]
Out[133]:
              0
stock1 price  1
stock2 price  3
stock3 price  5
Run Code Online (Sandbox Code Playgroud)

选项2:

In [134]: df.loc[pd.IndexSlice[:, 'price'], :]
Out[134]:
              0
stock1 price  1
stock2 price  3
stock3 price  5
Run Code Online (Sandbox Code Playgroud)


YPO*_*POC 17

我发现访问具有 MultiIndex 列的 DataFrame 中的二级列的最直观的解决方案是.loc与 一起使用slice()

如果你的 DataFrame 带有

df
  stock1        stock2        stock3       
   price volume  price volume  price volume
0      1      2      3      4      5      6
1      2      3      4      5      6      7
Run Code Online (Sandbox Code Playgroud)

使用df.loc[:, (slice(None), "price")]

将提供带有子列的所有列"price"

  stock1  stock2  stock3       
   price   price   price 
0      1       3       5
1      2       4       6
Run Code Online (Sandbox Code Playgroud)

df.loc[:, (slice(None), "price")]loc 的第一个参数中:,传递所有行的结果,第二个参数(slice(None), "price")是一个元组,负责选择所有第一级列 ( slice(None)) 和名称为 的所有第二级列"price"


Joh*_*nck 7

df.unstack()将“撕掉”您的最后一层MultiIndex并使您的 DataFrame 更加传统,每种类型的数据只有一列。例如:

index = pd.MultiIndex.from_product([['stock1','stock2','stock3'],['price','volume']])
df = pd.DataFrame([1,2,3,4,5,6], index)
print(df.unstack())
Run Code Online (Sandbox Code Playgroud)

给你:

           0       
       price volume
stock1     1      2
stock2     3      4
stock3     5      6
Run Code Online (Sandbox Code Playgroud)