【发布时间】:2017-10-22 08:29:00
【问题描述】:
所以,我正在处理一个相对较大的数据集,我觉得将列转换为正确的 dtype 需要花费很多时间。
到目前为止,我正在使用 apply 和 to_datetime 和 to_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,但一直收到错误消息,告诉我无法将列转换为浮点数。
-
查看此 SO 帖子:stackoverflow.com/questions/32034689/…
-
我使用了 dtypes = {'Date': 'str', 'Everything_else': 'float64'} 然后在 read_csv 中插入了 dtypes=dtypes。
-
@ScottBoston 谢谢,斯科特。我刚刚意识到绝对是 to_datetime 导致了问题。 to_numeric 自己花了 5 秒。我会将格式字符串添加到 to_datetime 中,看看是否有帮助。