用时间序列行索引进行多索引切分[英] MultiIndex Slicing with a Timeseries Row Index

本文是小编为大家收集整理的关于用时间序列行索引进行多索引切分的处理方法,想解了用时间序列行索引进行多索引切分的问题怎么解决?用时间序列行索引进行多索引切分问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我使用回答这个问题尝试在我的数据框上制作类似的切片.但这似乎不起作用,因为我的行索引是 TimeSeries.我不知道如何改写切片才能工作.

我使用的 df 有一个 TimeSeries 索引,列是一个两级 MultiIndex.对于任意行,我试图返回一系列由每个主要列的"px"子列组成的.在此处输入图片描述

第一次尝试:df.loc[0,(slice(None), 'px')]抛出一个TypeError,

TypeError: cannot do index indexing on <class 'pandas.tseries.index.DatetimeIndex'> with these indexers [0] of <type 'int'> 

所以我也尝试为它提供索引的 DateTime,而不是 int:

useIndex = sdf.index[0]
return df.loc[useIndex,(slice(None), 'px')]

这给出了一个:

KeyError: 'MultiIndex Slicing requires the index to be fully lexsorted tuple len (2), lexsort depth (0)' 

后记...

如果我只是做一个简单的,

useIndex = sdf.index[0]使用索引sdf.iloc[useIndex]

我得到了失败:

TypeError: cannot do label indexing on <class 'pandas.tseries.index.DatetimeIndex'> with these indexers [2015-10-08 00:00:00] of <class 'pandas.tslib.Timestamp'>

所以问题可能是我并没有真正将有效索引传递给 MultiIndex 切片?

=================

这里有两个例子: 第一个 df ('df') 我能够提取出我想要的数据.第二个 df, ('df2') 引发类型错误.

import pandas as pd
import numpy as np

cols = [['col_1', 'col_2'], ['delta', 'px']]
multi_idx = pd.MultiIndex.from_product(cols, names= ["level_0", "level_1"])
df = pd.DataFrame(np.random.rand(20).reshape(5, 4), index=range(5), columns=multi_idx)

row_number =1 

print df.loc[df.index[row_number], pd.IndexSlice[:, 'px']]

rng = pd.date_range('1/1/2011', periods=5, freq='H')
df2 = pd.DataFrame(np.random.rand(20).reshape(5, 4), index=rng, columns=multi_idx)

#print df2.loc[df.index[row_number], pd.IndexSlice[:, 'px']]
useIndex = df2.index[0] 

print df2.loc[useIndex, pd.IndexSlice[:, 'px']]

推荐答案

使用 IndexSlice 应该有助于获得您想要的结果.请注意,首先需要对列进行 lex 排序:

cols = [['col_1', 'col_2'], ['delta', 'px']]
multi_idx = pd.MultiIndex.from_product(cols, names= ["level_0", "level_1"])
df = pd.DataFrame(np.random.rand(20).reshape(5, 4), index=range(5), columns=multi_idx)

>>> df
level_0     col_1               col_2          
level_1     delta        px     delta        px
0        0.891758  0.071693  0.629897  0.693161
1        0.772542  0.022781  0.684584  0.892641
2        0.925957  0.794940  0.146950  0.134798
3        0.159558  0.842898  0.677927  0.028675
4        0.436268  0.989759  0.471879  0.101878

row_number = 3
>>> df.loc[df.index[row_number], pd.IndexSlice[:, 'px']]
level_0  level_1
col_1    px         0.842898
col_2    px         0.028675
Name: 3, dtype: float64

本文地址:https://www.itbaoku.cn/post/1727842.html