gpt4 book ai didi

python - 访问 Pandas DataFrame 最快的方法是什么?

转载 作者:太空宇宙 更新时间:2023-11-03 12:26:43 25 4
gpt4 key购买 nike

我有一个包含 541 列的 DataFrame df,我需要将其列名的所有唯一对保存到单独的 DataFrame 的行中,每行重复 8 次。

我想我会创建一个空的 DataFrame fp,通过 df 的列名进行双重循环,插入到每 8 行,并用最后一个可用值填充空白。

当我尝试这样做时,虽然我对它花费的时间感到困惑。有了 541 列,我只需要写 146,611 次,却花了 20 多分钟。这对于数据访问来说似乎是过分的。问题出在哪里,我该如何解决?与 Pandas 相比,用列生成相关矩阵所需的时间更少,所以我一定是做错了什么。

这是我的意思的一个可重现的例子:

fp = np.empty(shape = (146611, 10))
fp.fill(np.nan)

fp = pd.DataFrame(fp)

%timeit for idx in range(0, len(fp)): fp.iloc[idx, 0] = idx

# 1 loop, best of 3: 22.3 s per loop

最佳答案

不要做 iloc/loc/chained-indexing。单独使用 NumPy 接口(interface)可将速度提高约 180 倍。如果您进一步删除元素访问权限,我们可以将其提高到 180,000 倍。

fp = np.empty(shape = (146611, 10))
fp.fill(np.nan)

fp = pd.DataFrame(fp)

# this confirms how slow data access is on my computer
%timeit for idx in range(0, len(fp)): fp.iloc[idx, 0] = idx

1 loops, best of 3: 3min 9s per loop

# this accesses the underlying NumPy array, so you can directly set the data
%timeit for idx in range(0, len(fp)): fp.values[idx, 0] = idx

1 loops, best of 3: 1.19 s per loop

这是因为在 Python 层中有大量代码用于这种幻想索引,每个循环大约需要 10 微秒。应该使用 Pandas 索引来检索整个数据子集,然后您可以使用这些子集对整个数据帧进行矢量化操作。单个元素访问非常缓慢:使用 Python 字典将使您的性能提高 > 180 倍。

当您访问列或行而不是单个元素时,情况会好很多:好 3 个数量级。

# set all items in 1 go.
%timeit fp[0] = np.arange(146611)
1000 loops, best of 3: 814 µs per loop

道德

不要尝试通过链式索引、lociloc 访问单个元素。从 Python 列表(或 C 接口(interface),如果性能绝对关键),在单个分配中生成 NumPy 数组,然后对整个列或数据帧执行操作。

使用 NumPy 数组并直接对列而不是单个元素执行操作,我们的性能提高了 180,000 多倍。不太破旧。

编辑

@kushy 的评论表明 Pandas 可能有 optimized自从我最初写这个答案以来,在某些情况下索引。始终分析您自己的代码,您的里程可能会有所不同。

关于python - 访问 Pandas DataFrame 最快的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44960614/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com