【问题标题】:Fastest way to convert dtypes for big datasets in Python?在 Python 中为大数据集转换 dtypes 的最快方法?
【发布时间】:2017-10-22 08:29:00
【问题描述】:

所以,我正在处理一个相对较大的数据集,我觉得将列转换为正确的 dtype 需要花费很多时间。

到目前为止,我正在使用 applyto_datetimeto_numeric,如下所示:

df.iloc[:,[0,1,9]] = df.iloc[:,[0,1,9]].apply(pd.to_datetime, 
errors='coerce')
df.iloc[:,2:8] = df.iloc[:,2:8].apply(pd.to_numeric, errors='coerce')

我能够转换列,但花了大约 20 分钟。一定有更快的方法吗?

如果不是,我唯一的选择是减少数据集以进行数据探索还是购买更快的计算机?

编辑:问题主要是由于使用 to_datetime 没有格式化日期和时间。当我删除 iloc 并应用时,性能也有所提高,尽管它不如格式化日期和时间那么重要。

这是每个场景所花费的时间:

  • 没有使用 iloc 进行格式化需要 1027.11 秒才能运行
  • 不使用 iloc 没有格式化需要 789.15 秒才能运行
  • 格式化的日期时间需要 19.47 秒才能运行

巨大的改进。这是在一个有 2,049,280 行的数据集上。感谢@ScottBoston 和@DiegoAgher!

【问题讨论】:

  • 这个数据集最初是如何创建的?如果它是从文件中读取的,最好传递 dtypes 的提示。
  • 我使用了 pd.read_csv('dataset.txt', sep=';', low_memory=False)。我尝试使用 dtypes,但一直收到错误消息,告诉我无法将列转换为浮点数。
  • 我使用了 dtypes = {'Date': 'str', 'Everything_else': 'float64'} 然后在 read_csv 中插入了 dtypes=dtypes。
  • @ScottBoston 谢谢,斯科特。我刚刚意识到绝对是 to_datetime 导致了问题。 to_numeric 自己花了 5 秒。我会将格式字符串添加到 to_datetime 中,看看是否有帮助。

标签: python pandas


【解决方案1】:

apply 函数通常需要相当长的执行时间。 基于列的操作更快,您可以这样做:

df['column0'] = pd.to_datetime(df['column0'], errors='coerce')

其余列以此类推。

此外,如果您有特定的列格式,您可以尝试指定它以加快速度。

df['column0'] = pd.to_datetime(df['column0'], format=format, errors='coerce')

【讨论】:

  • OP 正在迭代感兴趣的列,所以他们正在尝试的已经考虑到了这一点
  • 我想我在 Stack Overflow 上读到过一段时间,有人提到将格式添加到时间将有助于提高速度。将时间格式字符串显式添加到 to_datetime。
  • @EdChum 我只是想取消.iloc[:, ...] 操作,因为我认为这可能会增加执行时间。
  • @ScottBoston 用你的贡献更新了答案,我认为这也很相关;)
  • @DiegoAgher 在这种情况下,这没什么大不了的,因为我只有 10 列,但我想添加 iloc 以防我使用包含更多列的数据集,所以我不必编写每列换行...哈哈
猜你喜欢
  • 1970-01-01
  • 2021-11-12
  • 2019-07-15
  • 1970-01-01
  • 2018-08-17
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
  • 2016-02-06
相关资源
最近更新 更多