2017-10-10 130 views
1

我有一个很大的数据框df其中我有一个完整列表indicesdf.index中的独特元素。我现在想创建一个由indices中的元素索引的所有子数据框的列表;具体将熊猫数据帧拆分为子数据框列表的最快方法

list_df = [df.loc[x] for x in indices] 

运行此命令正在尽管年龄(df有大约3e6行,3e3唯一索引)。这是一个合理的方式来执行此操作?我会很高兴收到任何可以改善此类问题和相关问题的意见或建议。

在此先感谢!

+0

我会很高兴,如果downvoter可以让我知道如何改善我的问题。谢谢! –

回答

1

您可以通过索引使用列表中理解的groupby对象 - level=0sort=False改变默认的排序为更快的解决方案:

L = [x for i, x in df.groupby(level=0, sort=False)] 

np.random.seed(123) 
N = 1000 
L = list('abcdefghijklmno') 
df = pd.DataFrame({'A': np.random.choice(L, N), 
        'B':np.random.randint(10, size=N)}, index=np.random.randint(100, size=N)) 

In [273]: %timeit [x for i, x in df.groupby(level=0, sort=False)] 
100 loops, best of 3: 9.91 ms per loop 

In [274]: %timeit [df.loc[x] for x in df.index] 
1 loop, best of 3: 417 ms per loop 
+0

感谢您的快速回复!如果此解决方案速度更快,我将尝试一下。 –

+0

我在做一些测试,我编辑答案一会儿。 – jezrael

+0

谢谢,它大大加快!你能解释为什么会发生? –