PandasDataFrame上的某些操作在处理稍大的数据时要花费数百倍的时间

mnemlml8  于 2023-01-19  发布在  其他
关注(0)|答案(1)|浏览(145)

我有一些数据框,它们以物种指示符作为列,在这些示例中为30,以及数量可变的行,这里的示例是450_631(* low )和948_084( high *)。实际上,我有成千上万个这样的数据框,这就是为什么性能对我很重要。
Dataframe 包含0和1。
low DataFrame
| | 智人13|泛_泛13|...|山羊_山羊.12|马_卡巴鲁斯.17|
| - ------|- ------|- ------|- ------|- ------|- ------|
| 无|无|无|...|1个|无|
| 1个|无|无|...|无|无|
| ...|...|...|...|...|...|
| 小行星450629|无|无|...|无|1个|
| 小行星450630|无|无|...|无|无|
high DataFrame
| | 人类20|大猩猩_大猩猩.20|...|猕猴属10|美洲豹_豹. KV860304.1|
| - ------|- ------|- ------|- ------|- ------|- ------|
| 无|无|无|...|无|无|
| 1个|无|无|...|1个|无|
| ...|...|...|...|...|...|
| 小行星948|无|1个|...|1个|1个|
| 小行星948|无|1个|...|1个|1个|
例如,我现在要做的是用Pandas函数cumsum来计算累积和。
我观察到的是,对于"小" Dataframe ,如示例 * low *,它只需要几分之一秒,然而,对于一些较大的 Dataframe ,如示例 * high *,它需要几分钟,尽管它的数据量大约是示例 * high * 的两倍。
low cumsum,计算耗时约0.2秒
| | 智人13|泛_泛13|...|山羊_山羊.12|马_卡巴鲁斯.17|
| - ------|- ------|- ------|- ------|- ------|- ------|
| 无|无|无|...|1个|无|
| 1个|无|无|...|1个|无|
| ...|...|...|...|...|...|
| 小行星450629|无|小行星2606|...|小行星73099|小行星72252|
| 小行星450630|无|小行星2606|...|小行星73099|小行星72252|
high cumsum,计算耗时约150秒
| | 人类20|大猩猩_大猩猩.20|...|猕猴属10|美洲豹_豹. KV860304.1|
| - ------|- ------|- ------|- ------|- ------|- ------|
| 无|无|无|...|无|无|
| 1个|无|无|...|1个|无|
| ...|...|...|...|...|...|
| 小行星948|无|小行星8463|...|小行星39761|小行星239|
| 小行星948|无|小行星8464|...|小行星39762|小行星239|
我在复制(DataFrame.copy())或索引(DataFrame [list_of_indexs])时观察到了类似的模式,我不明白为什么对这些较大的DataFrame的某些操作与对较小的DataFrame的操作相比需要不合理的更长时间。

    • 编辑:**

在我本地的笔记本电脑上运行了同样的过程,**high. cumsum()**在1.6秒内完成,这似乎很合理。这表明问题应该出在CPU或服务器如何工作上,这超出了我的理解范围。

    • EIDT2:**

问题似乎出在我运行脚本的服务器上,在我的笔记本电脑或其他服务器(都是英特尔至强)上运行脚本时,运行正常,但只有在一台机器上发现了这种奇怪的行为。
从现在开始我就用另一台服务器了。

t1qtbnec

t1qtbnec1#

我想知道为什么这个操作要花这么长时间。你确定你的 Dataframe 中只有数字数据吗?我的计算机(一个不错的I7第8代)只需要30秒就可以完成这个任务的 Dataframe 与1000列和900k行。

import time

df_test = pd.DataFrame(np.random.random_integers(0,1,(900_000,1000)))

start_time = time.time()
df_test.cumsum()
end_time = time.time()
print(end_time - start_time)

如果这不是类型的问题,你可以在执行此任务之前将 Dataframe 转换为numpy数组来加快速度:

df_test.to_numpy().cumsum(axis=0)

这使得此任务的时间减少了约30%。

相关问题