python - 使用 dataframe.mean()( Pandas 性能非数字列)时,运行时间出现奇怪的指数增长

标签 python pandas

我正在使用天气数据集(要重现;数据可以找到 here 解压缩它并运行下面的代码),我想对数据进行规范化。为此,我尝试了这个问题的第二个答案;

Normalize columns of pandas data frame

归结为 normalized_df=(df-df.mean(axis=0))/df.std(axis=0)
但是,执行此代码需要很长时间。于是,我开始调查,似乎是df.mean()的时候了。通话次数呈指数级增长。

我使用以下代码来测试运行时:

import pandas as pd
import time

jena_climate_df = pd.read_csv("jena_climate_2009_2016.csv")
start = time.time()
print(jena_climate_df[:200000].mean(axis=0)) #Modify the number of rows here to observe the increase in time
stop = time.time()
print(f"{stop-start} Seconds for mean calc")

我进行了一些测试,选择逐渐增加用于平均计算的行数。查看以下结果:
0.004987955093383789 Seconds for mean calc ~ 10 observations
0.009006738662719727 Seconds for mean calc ~ 1000 observations
0.0837397575378418 Seconds for mean calc ~ 10000 observations
1.789750337600708 Seconds for mean calc ~ 50000 observations
7.518809795379639 Seconds for mean calc ~ 60000 observations
19.989460706710815 Seconds for mean calc ~ 70000 observations
71.97900629043579 Seconds for mean calc ~ 100000 observations
375.04513001441956 Seconds for mean calc ~ 200000 observations

在我看来,时间呈指数增长。我不知道为什么会发生这种情况,AFAIK 添加所有值并将它们除以观察次数不应该计算量太大,但也许我在这里错了。一些解释将不胜感激!

最佳答案

我做了一些测试,在这种情况下,罪魁祸首似乎是“日期时间”——非数字列。

首先,当单独计算不同列的平均值时,显然没有指数行为(见下图 - X 轴是行数,y 轴是时间)。 enter image description here

其次,我然后尝试在下面计算整个数据框的均值
三个场景(每个场景有 80K 行),并用 %%timeit 计时:

  • jena_climate_df[0:80000].mean(axis=0) : 10.2 秒。
  • 将日期/时间列设置为索引:jena_climate_df.set_index("Date Time")[0:80000].mean(axis=0) - 40 ms (大约是之前测试的 0.4%)。
  • 最后,删除日期/时间列:jena_climate_df.drop("Date Time", axis=1)[0:80000].mean(axis=0) - 19.8 毫秒(原始时间的 0.2%)。

  • 希望这可以帮助。

    关于python - 使用 dataframe.mean()( Pandas 性能非数字列)时,运行时间出现奇怪的指数增长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61726904/

    相关文章:

    python - 如何在 bottle 中使用 jinja2 i18n(带 babel)

    python - 连接 pandas 数据框中的元组列表

    python - 如何在一段时间内使用 pandas groupby 来查找同一时间​​段内多年来的平均计数

    python - 如何使用 Python 在一个命令中追加和设置值?

    python - 查找 pandas 数据框中分组日期时间列的时间仓中的最大事务数

    python - Matplotlib:如何在 3D 图形中绘制垂直平面

    python - 如何建立卡方分布表

    python - 按计数值对字典进行排序

    python - 使用 Google Apps api 的模拟进行单元测试 - 管理目录 API

    python - 如何检索 Pandas 数据框中的 k 个最大值?