pandas multiindex - как выбрать второй уровень при использовании столбцов?

У меня есть датафрейм с этим индексом:

index = pd.MultiIndex.from_product([['stock1','stock2'...],['price','volume'...]])

Это полезная структура для возможности сделать df['stock1'], но как мне выбрать все данные о ценах? Я не могу разобраться в документации.

Я безуспешно пробовал следующее: df[:,'price'] df[:]['price'] df.loc(axis=1)[:,'close'] df['price]

Если этот индексный стиль по какой-то причине считается плохой идеей, то какой вариант будет лучше? Должен ли я использовать многоиндексный индекс для акций в качестве меток на временных рядах, а не на уровне столбцов?

Большое спасибо

ОБНОВЛЕНИЕ - я использую мультииндекс для столбцов, а не индекс (формулировка меня одолела). Примеры в документации фокусируются на многоуровневых индексах, а не на структурах столбцов.

Ответ 1

Также используя образец данных 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

В качестве альтернативы, если вместо столбцов имеется 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

Ответ 2

Используя образец данных @JohnZwinck:

In [132]: df
Out[132]:
               0
stock1 price   1
       volume  2
stock2 price   3
       volume  4
stock3 price   5
       volume  6

Опция 1:

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

Вариант 2:

In [134]: df.loc[pd.IndexSlice[:, 'price'], :]
Out[134]:
              0
stock1 price  1
stock2 price  3
stock3 price  5

Ответ 3

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())

Дает тебе:

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

Ответ 4

Я также заметил, что вы пропустили этот вариант:

df.loc[:,"price"]

Что касается наилучшей практики ваших временных данных, сохраните ее в столбце, соответствующем строкам, предпочтительно в качестве объекта datetime в Python (у pandas есть встроенная поддержка функций для него). Вы можете использовать синтаксис маски, чтобы получить время, соответствующее вашим интересам.

Таким образом вы получаете доступ к одному столбцу вашего фрейма данных. Однако для нескольких столбцов мы можем передать список или двоеточие, чтобы получить все:

df.loc[:,["price","volume"]] 
#or
df.loc[:,:]

Полезным способом запроса (и быстрого) является использование масок, чтобы указать, какие строки/столбцы соответствуют тому условию, которое вы хотите:

Mask=df.loc[:,"price"]>50.0
df.loc[Mask, "stock"] #should return the stock prices greater than 50bucks. 

Надеюсь, что это поможет, и, как всегда, не стесняйтесь следить за этим ответом, если я полностью неправильно понял ваш вопрос, я бы хотел помочь дальше.