Python 如何更快地访问多索引内容?

Python 如何更快地访问多索引内容?,python,pandas,multi-index,Python,Pandas,Multi Index,假设我有一个多索引列数据框架,如下所示: value serial 1 2 3 4 5 name Tom 0.657175 -0.999668 0.750363 1.113235 -1.199095

假设我有一个多索引列数据框架,如下所示:

           value                                        
serial         1         2         3         4         5
name                                                    
Tom     0.657175 -0.999668  0.750363  1.113235 -1.199095
我想使用for循环访问每一列。我可以在多索引结构下进行:

#with multi-index

for i in range(1,6):
    x = df['value'][i]
但是,这比将列合并到一个级别要慢得多:

#collapse multi-index

df.columns = [x[0] + str(x[1]) for x in df.columns]
for i in range(1,6):
    x = df['value'+str(i)]
我不明白为什么会这样。既然我想保持数据帧的多索引结构,那么有没有更快的方法来访问内容呢?或者有没有一种方法可以轻松地将代码2中的索引转换回多索引

注释:正如@joris所指出的,我意识到有两种方法可以访问多索引列。虽然这两种方式都列在pandas文档中,但df['value',i]比df['value'][i]快得多;两者都比df['value'+stri]慢。以下是三种方式的速度比较:

%timeit -n 1000 x = df['value'][2]
1000 loops, best of 3: 350 µs per loop
%timeit -n 1000 x = df[('value', 2)]
1000 loops, best of 3: 18.6 µs per loop
%timeit -n 1000 x = df['value' + str(2)]
1000 loops, best of 3: 4.1 µs per loop

非常感谢您的帮助。

正常的多索引列访问类似于df['value',i]。这比df['value'][i]快吗?@joris,谢谢!它确实快得多,尽管仍然比我测试代码中折叠的列慢50%。然而,当我在数据上运行它时,它的速度大约与df['value'][I]一样慢,比折叠列慢10倍多。我得到了警告消息SettingWithCopyWarning:一个值正试图通过df['value'][I]在数据帧中的一个切片副本上设置。你认为这可能是问题所在吗?这是使用多索引的一个折衷方案,它稍微慢一点。但是设置WithCopyWarning是因为,正如警告所说,您正试图在数据帧的一部分的副本中设置新值,因此需要更改。我想在您的示例代码中,您试图修改x。另见。你想在for循环中做什么?@joris,谢谢!我认为就我而言,这个警告是假阳性的。它只有在我使用多索引时才会弹出。我在这种情况下使用循环:我有大约20个变量列,称为'event1',…'event20',我正在寻找一个关键字'keywd',它可以出现在任何一个关键字中,它出现在不同观察行的不同事件变量中。我需要为每个观察记录keywd事件及其对应的日期,即,我有一个对应于每个事件列的日期列。如果你能想出比for循环更好的方法,请告诉我。