我的编程空间,编程开发者的网络收藏夹
学习永远不晚

pandas初学者容易犯的错误有哪些

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

pandas初学者容易犯的错误有哪些

这篇文章给大家分享的是有关pandas初学者容易犯的错误有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

使用pandas自带的函数读取大文件

第一个错误与实际使用Pandas完成某些任务有关。具体来说我们在实际处理表格的数据集都非常庞大。使用pandas的read_csv读取大文件将是你最大的错误。

为什么?因为它太慢了!看看这个测试,我们加载TPS十月数据集,它有1M行和大约300个特性,占用了2.2GB的磁盘空间。

import pandas as pd%%timetps_october = pd.read_csv("data/train.csv")Wall time: 21.8 s

read_csv花了大约22秒。你可能会说22秒并不多。但是在一个项目中,需要在不同的阶段执行许多实验。我们会创建很多单独的脚本,用于清理、特征工程、选择模型,以及其他任务。多次等待数据加载20秒就变得很长了。此外,数据集可能会更大时间就会更长。那么有什么更快的解决方案呢?

解决方案是在这个阶段放弃Pandas,使用其他为快速IO设计的替代方案。我最喜欢的是datatable,但你也可以选择Dask, Vaex, cuDF等。这里是用datatable加载相同的数据集所需要的时间:

import datatable as dt  # pip install datatble%%timetps_dt_october = dt.fread("data/train.csv").to_pandas()------------------------------------------------------------Wall time: 2 s

只有2秒,10倍差距

没有矢量化

函数式编程中最重要的规则之一就是永远不要使用循环。似乎在使用 Pandas 时坚持这个“无循环”规则是加速计算的最佳方法。

函数式编程用递归代替循环。虽然递归也会出现各种问题(这个我们这里不考虑),但是对于科学计算来说使用矢量化是最好的选择!

矢量化是 Pandas 和 NumPy 的核心,它对整个数组而不是单个标量执行数学运算。 Pandas 已经拥有一套广泛的矢量化函数,我们无需重新发明轮子,只要关注我们的重点如何计算就好了。

在 Pandas 中进行Python 的大部分算术运算符(+、-、*、/、**)都以矢量化方式工作。此外,在 Pandas 或 NumPy 中看到的任何其他数学函数都已经矢量化了。

为了验证到速度的提高,我们将使用下面的 big_function,它以三列作为输入并执行一些无意义的算术作为测试:

def big_function(col1, col2, col3):    return np.log(col1 ** 10 / col2 ** 9 + np.sqrt(col3 ** 3))

首先,我们将这个函数与 Pandas 最快的迭代器——apply 一起使用:

%time tps_october['f1000'] = tps_october.apply(      lambda row: big_function(row['f0'], row['f1'], row['f2']), axis=1    )-------------------------------------------------Wall time: 20.1 s

操作耗时20秒。 让我们以矢量化的方式使用核心 NumPy 数组来做同样的事情:

%time tps_october['f1001'] = big_function(tps_october['f0'].values,                                           tps_october['f1'].values,                                           tps_october['f2'].values)------------------------------------------------------------------Wall time: 82 ms

只用了 82 毫秒,快了大约 250 倍。

事实上我们不能完全抛弃循环。 因为并非所有数据操作操作都是数学运算。 但是每当发现需要使用一些循环函数(例如 apply、applymap 或 itertuples)时,花点时间看看想要做的事情是否可以矢量化是一个非常好的习惯。

数据类型,dtypes!

我们可以根据内存使用情况指定数据类型。

pandas中最糟糕也是最耗内存的数据类型是 object,这也恰好限制了 Pandas 的一些功能。 剩下的我们还有浮点数和整数。 以下这张表是pandas的所有类型:

pandas初学者容易犯的错误有哪些

Pandas命名方式中,数据类型名称之后的数字表示此数据类型中的每个数字将占用多少位内存。 因此,我们的想法是将数据集中的每一列都转换为尽可能小的子类型。 我们只要根据规则来判断就可以了,这是规则表:

pandas初学者容易犯的错误有哪些

通常,根据上表将浮点数转换为 float16/32 并将具有正整数和负整数的列转换为 int8/16/32。 还可以将 uint8 用于布尔值和仅正整数,以进一步减少内存消耗。

这个函数你一定很眼熟,因为他在Kaggle中被广泛使用,它根据上表将浮点数和整数转换为它们的最小子类型:

def reduce_memory_usage(df, verbose=True):    numerics = ["int8", "int16", "int32", "int64", "float16", "float32", "float64"]    start_mem = df.memory_usage().sum() / 1024 ** 2    for col in df.columns:        col_type = df[col].dtypes        if col_type in numerics:            c_min = df[col].min()            c_max = df[col].max()            if str(col_type)[:3] == "int":                if c_min > np.iinfo(np.int8).min and c_max < np.iinfo(np.int8).max:                    df[col] = df[col].astype(np.int8)                elif c_min > np.iinfo(np.int16).min and c_max < np.iinfo(np.int16).max:                    df[col] = df[col].astype(np.int16)                elif c_min > np.iinfo(np.int32).min and c_max < np.iinfo(np.int32).max:                    df[col] = df[col].astype(np.int32)                elif c_min > np.iinfo(np.int64).min and c_max < np.iinfo(np.int64).max:                    df[col] = df[col].astype(np.int64)            else:                if (                    c_min > np.finfo(np.float16).min                    and c_max < np.finfo(np.float16).max                ):                    df[col] = df[col].astype(np.float16)                elif (                    c_min > np.finfo(np.float32).min                    and c_max < np.finfo(np.float32).max                ):                    df[col] = df[col].astype(np.float32)                else:                    df[col] = df[col].astype(np.float64)    end_mem = df.memory_usage().sum() / 1024 ** 2    if verbose:        print(            "Mem. usage decreased to {:.2f} Mb ({:.1f}% reduction)".format(                end_mem, 100 * (start_mem - end_mem) / start_mem            )        )    return df

让我们在 TPS 十月份的数据上使用它,看看我们能减少多少:

>>> reduce_memory_usage(tps_october)Mem. usage decreased to 509.26 Mb (76.9% reduction)

pandas初学者容易犯的错误有哪些

我们将数据集从原来的 2.2GB 压缩到 510MB。当我们将df保存到csv文件时,这种内存消耗的减少会丢失因为csv还是以字符串的形式保存的,但是如果使用pickle保存那就没问题了。

为什么要减小内存占用呢? 在使用大型机器学习模型处理此类数据集时,内存的占用和消耗起着重要作用。 一旦遇到一些 OutOfMemory 错误,你就会开始追赶并学习这样的技巧来让计算机保持愉快的工作(谁让Kaggle只给16G的内存呢,都是逼出来的)。

不设置样式

Pandas 最美妙的功能之一是它能够在显示DF时设定不同的样式,在 Jupyter 中将原始DF呈现为带有一些 CSS HTML 表格。

Pandas 允许通过 style 属性对其 DataFrame 进行样式设置。

tps_october.sample(20, axis=1).describe().T.style.bar(    subset=["mean"], color="#205ff2").background_gradient(subset=["std"], cmap="Reds").background_gradient(    subset=["50%"], cmap="coolwarm")

pandas初学者容易犯的错误有哪些

我们随机选择 20 列,为它们创建一个 5 位数的汇总,并转置结果,根据它们的大小为均值、标准差和中值列着色。添加这样的样式可以让我们更轻松地发现原始数字中的模式,设置无需使用其他的可视化库。

实际上,不对df进行样式设置并没有错。 但是这的确是一个很好的功能,对吧。

使用 CSV格式保存文件

就像读取 CSV 文件非常慢一样,将数据保存回它们也是如此。 以下是将 TPS 十月数据保存到 CSV 所需的时间:

%%timetps_october.to_csv("data/copy.csv")------------------------------------------Wall time: 2min 43s

花了将近3分钟。 为了节省时间可以保存为parquet,feather 甚至pickle。

%%timetps_october.to_feather("data/copy.feather")Wall time: 1.05 s--------------------------------------------------------------------------------%%timetps_october.to_parquet("data/copy.parquet")Wall time: 7.84 s

不看文档!

实际上,这个对我来说最严重的错误是没有阅读Pandas 的文档。但是一般情况下没人会阅读文档,对吧。有时候 我们宁愿在互联网上搜索数小时也不愿阅读文档。

但是当涉及到 Pandas 时,这个就是一个非常大的错误了。因为它像sklearn一样有一个出色的用户指南,涵盖从基础知识到如何贡献代码,甚至是如何设置更漂亮的主题(也许可能就是因为太多了,所以没人看)。

我今天提到的所有错误都可以在文档中找到。 甚至在文档的“大型数据集”部分会专门告诉你使用其他软件包(如 Dask)来读取大文件并远离 Pandas。 其实如果我有时间从头到尾阅读用户指南,我可能会提出 50 个新手错误,所以还是看看文档吧。

感谢各位的阅读!关于“pandas初学者容易犯的错误有哪些”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

pandas初学者容易犯的错误有哪些

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

pandas初学者容易犯的错误有哪些

这篇文章给大家分享的是有关pandas初学者容易犯的错误有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。使用pandas自带的函数读取大文件第一个错误与实际使用Pandas完成某些任务有关。具体来说我们在实际
2023-06-25

C语言中动态内存管理初学者容易犯的错误有哪些

这篇“C语言中动态内存管理初学者容易犯的错误有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C语言中动态内存管理初学者容
2023-07-05

Java程序最容易犯的错误有哪些呢

今天就跟大家聊聊有关Java程序最容易犯的错误有哪些呢,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。  1.Duplicated Code  代码重复几乎是最常见的异味了。他也是Re
2023-06-03

Linux新手最容易犯哪些错误

这篇文章主要介绍“Linux新手最容易犯哪些错误”,在日常操作中,相信很多人在Linux新手最容易犯哪些错误问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux新手最容易犯哪些错误”的疑惑有所帮助!接下来
2023-06-16

Python新手入门最容易犯的错误有哪些?

  Python以其简单易懂的语法格式与其它语言形成鲜明对比,初学者遇到最多的问题就是不按照Python 的规则来写,即便是有编程经验的程序员,也容易按照固有的思维和语法格式来写 Python 代码,这样就容易发生错误,以下列举了Pytho
2023-06-02

Java初学者容易混淆的问题有哪些

今天小编给大家分享一下Java初学者容易混淆的问题有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.String类和S
2023-06-03

php初学者常见的错误有哪些

这篇“php初学者常见的错误有哪些”除了程序员外大部分人都不太理解,今天小编为了让大家更加理解“php初学者常见的错误有哪些”,给大家总结了以下内容,具有一定借鉴价值,内容详细步骤清晰,细节处理妥当,希望大家通过这篇文章有所收获,下面让我们
2023-06-06

C#编程中最容易犯的编写错误有哪些

这篇文章主要讲解了“C#编程中最容易犯的编写错误有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#编程中最容易犯的编写错误有哪些”吧!1、拼接字符串在C#编程中,字符串类型的处理是比较
2023-07-05

C语言中动态内存管理初学者容易犯的6个错误分享

本篇文章主要介绍了初学者使用C语言中动态内存管理的4个函数时最容易犯的6个错误,以及如何避免这些错误,文中的示例代码讲解详细,感兴趣的可以了解一下
2023-05-14

最容易犯的Python开发错误分别是哪些

这篇文章给大家介绍最容易犯的Python开发错误分别是哪些,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Python是一门简单易学的编程语言,语法简洁而清晰,并且拥有丰富和强大的类库。与其它大多数程序设计语言使用大括号
2023-06-17

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录