【发布时间】:2016-07-21 21:16:37
【问题描述】:
有人愿意尝试加快这个数据帧索引切片方案的速度吗? 我正在尝试对一些巨大的数据帧进行切片和切块,因此每一位都很重要。我需要以某种方式找到一种更快的索引切片数据帧的方法,而不是以下技术:
v = initFrame.xs(x,level=('ifoo2','ifoo3'), drop_level=False)
pd.unique 中的循环也会显着影响性能。
uniqueList = list(pd.unique(initFrame[['bar1','bar4']].values))
复制并粘贴下面的 sn-p 以避免设置。
import pandas as pd
foo1 = (['LABEL1','LABEL1','LABEL2','LABEL2'])
foo2 = ([5,5,6,6])
foo3 = ([1,1,2,3])
index = pd.MultiIndex.from_arrays([foo1,foo2,foo3], names=['ifoo1','ifoo2','ifoo3'])
initFrame = pd.DataFrame({'bar1': [ 5,6,5,6],
'bar2': ['a','b','c','d'],
'bar3': [11,22,33,44],
'bar4': [1,2,1,3]}, index=index)
finDict = {}
#start timer1
uniqueList = list(pd.unique(initFrame[['bar1','bar4']].values))
#end timer1
for x in uniqueList:
#start timer2
v = initFrame.xs(x,level=('ifoo2','ifoo3'), drop_level=False)
#stop timer2
k = int(x[0]), int(x[1])
finDict.update({k:v})
更新 2016-04-04
对于那些感兴趣的人,我最终使用了以下内容:
finDict = {}
grouper = initFrame.groupby(level=('ifoo2', 'ifoo3'))
for name, group in grouper:
finDict.update({name:group})
【问题讨论】:
-
你关心两个定时器之间的速度,还是
uniqueList中的循环? -
你说得对!没有完成我的帖子。已编辑,谢谢。
-
执行
unique和list,然后再一次 for 循环就像针对 1 个可能的循环执行 3 x 循环。再次考虑到您的数据集很大,准备工作将永远进行。
标签: python pandas dataframe slice