【问题标题】:Fastest way to split a pandas dataframe into a list of subdataframes将熊猫数据框拆分为子数据框列表的最快方法
【发布时间】:2018-03-21 22:22:18
【问题描述】:

我有一个大型数据框 df,我有一个完整的列表 indices df.index 中的唯一元素。我现在想创建一个由indices 中的元素索引的所有子数据框的列表;具体

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

虽然运行此命令需要很长时间(df 大约有 3e6 行和 3e3 唯一索引)。这是执行此操作的合理方式吗?我很乐意收到任何可以改善此问题和相关问题的性能的 cmets 或建议。

提前致谢!

【问题讨论】:

  • 如果反对者能让我知道如何改进我的问题,我会很高兴。谢谢!
  • 你可能想看看np.array_split

标签: python performance pandas dataframe


【解决方案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

【讨论】:

  • 感谢您的快速回复!我会试试这个解决方案是否更快。
  • 谢谢,它的速度大大提高了!你能解释一下为什么会这样吗?
  • 在我个人的例子中:197.030567884 seconds 代表我的解决方案,1.07291507721 seconds 代表 jezrael 的解决方案,如果 sort=False 则下降到 0.949830770493 seconds
猜你喜欢
  • 2019-04-11
  • 2018-12-04
  • 2018-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多