使用MultiIndex切片(熊猫)苦苦挣扎

时间:2014-08-10 23:39:58

标签: python pandas slice multi-index

我正在将我的数据文件夹组织成多索引数据框,其结构类似于:

In: df
Out: 
Sweep  Time       Primary  Secondary     720nm     473nm  PMTShutter                                                      
Sweep1 0.00000 -87.429810  -4.882812  0.000610  0.000305    0.000000
       0.00005 -87.445068  -4.882812  0.000610  0.001221    0.000000
       0.00010 -87.451172  -4.272460  0.000000  0.000916    0.000000
           ...        ...       ...       ...         ...  
Sweep5 0.68655 -87.261963  -4.272461  0.000305  0.000916    0.000305
       0.68660 -87.258911  -4.272461  0.000305  0.000916    0.000305
       0.68665 -87.252808  -5.493164  0.000000  0.000916    0.000305
       0.68670 -87.261963  -4.272461  0.000305  0.000916    0.000305

我无法阅读Pandas的文档,试图找出如何基于这两个索引对这部分内容进行切片。

例如,我认为df ['Sweep1']将返回Sweep1的所有内容。但事实并非如此。但是,df.loc ['Sweep1']的工作方式与我的预期相同。为什么会这样?

我似乎完全无法通过时间索引进行索引。例如,我们分析的一个非常典型的部分是在特定时间范围内平均数据点,或者在特定时间段内找到最大值或最小值。那么,如何基于时间索引的特定时段(例如,时间0.0秒到0.5秒)切出数据区域。

如果我知道该范围内的数据点的确切数量(即范围*采样频率),我可以实现这一点,但是将时间设置为其中一个索引的目的是为了解决这个问题。

同样地,如果我想绘制让我们说Sweep1 Primary by Time - 我似乎无法弄清楚如何使用Time索引作为我的x轴。

所以,我想我的主要问题是:我如何根据扫描数和时间的某个子区域切出不同列中的数据点。这至少会让我指出正确的方向。

由于

2 个答案:

答案 0 :(得分:0)

问题1:

df['Sweep1']是返回名为Sweep1的列的正确语法。要对索引(行)进行切片,您可以执行df.ix['Sweep1']

问题2:

在切片时间之前,您需要创建一个布尔系列。我认为最简单的方法是将其用作列,例如

Time = df.reset_index('Time').Time
boolean = Time[(Time >= 0) & (Time < 0.5)]
result =  df.loc[('Sweep1', boolean),:]

答案 1 :(得分:0)

以下内容应为您提供索引Primary的t1-t2范围内的列PMTShutterSweep1。 t1和t2是花车。

idx = pandas.IndexSlice
df.loc[idx['Sweep1',t1:t2],['Primary', 'PMTShutter']]