在多重索引切片中遇到困难(Pandas)

0 投票
2 回答
596 浏览
提问于 2025-04-18 16:46

我正在把我的数据文件夹整理成多重索引的数据框,结构大概是这样的:

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的主要数据和时间的关系图,我也不知道怎么把时间索引用作x轴。

所以,我想问的主要问题是:我该如何根据Sweep编号和时间的某个子区域来切出不同列的数据点。这至少能让我朝着正确的方向前进。

谢谢!

2 个回答

0

下面的内容应该能让你在索引 Sweep1 的 t1 到 t2 范围内得到 PrimaryPMTShutter 这两列。这里的 t1 和 t2 是小数。

idx = pandas.IndexSlice
df.loc[idx['Sweep1',t1:t2],['Primary', 'PMTShutter']]
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),:]

撰写回答