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.
Надеюсь, что это поможет, и, как всегда, не стесняйтесь следить за этим ответом, если я полностью неправильно понял ваш вопрос, я бы хотел помочь дальше.