pandas object转float_25个Pandas实用技巧

本文一共为大家分享25个pandas技巧,此为上篇~

显示已安装的版本

输入下面的命令查询pandas版本:

In [7]:pd.__version__Out[7]:'0.24.2'

如果你还想知道pandas所依赖的模块的版本,你可以使用show_versions()函数:

In [9]:pd.show_versions()INSTALLED VERSIONS ------------------ commit: None python: 3.7.3.final.0 python-bits: 64 OS: Darwin OS-release: 18.6.0 machine: x86_64 processor: i386 byteorder: little LC_ALL: None LANG: en_US.UTF-8 LOCALE: en_US.UTF-8 pandas: 0.24.2 pytest: None pip: 19.1.1 setuptools: 41.0.1 Cython: None numpy: 1.16.4 scipy: None pyarrow: None xarray: None IPython: 7.5.0 sphinx: None patsy: None dateutil: 2.8.0 pytz: 2019.1 blosc: None bottleneck: None tables: None numexpr: None feather: None matplotlib: 3.1.0 openpyxl: None xlrd: None xlwt: None xlsxwriter: None lxml.etree: None bs4: None html5lib: None sqlalchemy: None pymysql: None psycopg2: None jinja2: 2.10.1 s3fs: None fastparquet: None pandas_gbq: None pandas_datareader: None gcsfs: None

你可以查看到Python,pandas, Numpy, matplotlib等的版本信息。

创建示例DataFrame

假设你需要创建一个示例DataFrame。有很多种实现的途径,我最喜欢的方式是传一个字典给DataFrame constructor,其中字典中的keys为列名,values为列的取值。

7a24d7a5c2b7b0f6f741733b10ea4921.png

现在如果你需要创建一个更大的DataFrame,上述方法则需要太多的输入。在这种情况下,你可以使用Numpy的random.rand()函数,告诉它行数和列数,将它传递给DataFrame constructor:

5d83ba3f4c3ddab30544721560b46d14.png

这种方式很好,但如果你还想把列名变为非数值型的,你可以强制地将一串字符赋值给columns参数

50b335b833114059e181195b5c569060.png

你可以想到,你传递的字符串的长度必须与列数相同。

更改列名

让我们来看一下刚才我们创建的示例DataFrame:

877b908034d3e7fd7ed0b3deb852957c.png

我更喜欢在选取pandas列的时候使用点(.),但是这对那么列名中含有空格的列不会生效。让我们来修复这个问题。


更改列名最灵活的方式是使用rename()函数。你可以传递一个字典,其中keys为原列名,values为新列名,还可以指定axis:

In [14]:df = df.rename({'col one':'col_one', 'col two':'col_two'}, axis='columns')

使用这个函数最好的方式是你需要更改任意数量的列名,不管是一列或者全部的列。


如果你需要一次性重新命令所有的列名,更简单的方式就是重写DataFrame的columns属性

In [15]:df.columns = ['col_one', 'col_two']

如果你需要做的仅仅是将空格换成下划线,那么更好的办法是使用str.replace()方法,这是因为你都不需要输入所有的列名:

In [16]:df.columns = df.columns.str.replace(' ', '_')

上述三个函数的结果都一样,可以更改列名使得列名中不含有空格:

8cde13f6e368b1799d92db045270192e.png

最后,如果你需要在列名中添加前缀或者后缀,你可以使用add_prefix()函数

65b6de745d10ae4d6b7157c4c1cf0b37.png

或者使用add_suffix()函数

c9c9ec0ab6bc1a85ebf7fb4735f1a8fe.png

行序反转

让我们来看一下drinks这个DataFame:

In [20]:drinks.head()Out[20]:
countrybeer_servingsspirit_servingswine_servingstotal_litres_of_pure_alcoholcontinent
0Afghanistan0000.0Asia
1Albania89132544.9Europe
2Algeria250140.7Africa
3Andorra24513831212.4Europe
4Angola21757455.9Africa

该数据集描述了每个国家的平均酒消费量。如果你想要将行序反转呢?

最直接的办法是使用loc函数并传递::-1,跟Python中列表反转时使用的切片符号一致:

In [21]:drinks.loc[::-1].head()Out[21]:
countrybeer_servingsspirit_servingswine_servingstotal_litres_of_pure_alcoholcontinent
192Zimbabwe641844.7Africa
191Zambia321942.5Africa
190Yemen6000.1Asia
189Vietnam111212.0Asia
188Venezuela33310037.7South America


如果你还想重置索引使得它从0开始呢?


你可以使用reset_index()函数,告诉他去掉完全抛弃之前的索引

In [22]:drinks.loc[::-1].reset_index(drop=True).head()Out[22]:
countrybeer_servingsspirit_servingswine_servingstotal_litres_of_pure_alcoholcontinent
0Zimbabwe641844.7Africa
1Zambia321942.5Africa
2Yemen6000.1Asia
3Vietnam111212.0Asia
4Venezuela33310037.7South America

你可以看到,行序已经反转,索引也被重置为默认的整数序号。

列序反转

跟之前的技巧一样,你也可以使用loc函数将列从左至右反转:

In [23]:drinks.loc[:, ::-1].head()Out[23]:
continenttotal_litres_of_pure_alcoholwine_servingsspirit_servingsbeer_servingscountry
0Asia0.0000Afghanistan
1Europe4.95413289Albania
2Africa0.714025Algeria
3Europe12.4312138245Andorra
4Africa5.94557217Angola

逗号之前的冒号表示选择所有行,逗号之后的::-1表示反转所有的列,这就是为什么country这一列现在在最右边。

通过数据类型选择列

这里有drinks这个DataFrame的数据类型:

In [24]:drinks.dtypesOut[24]:country                          objectbeer_servings                     int64spirit_servings                   int64wine_servings                     int64total_litres_of_pure_alcohol    float64continent                        objectdtype: object

假设你仅仅需要选取数值型的列,那么你可以使用select_dtypes()函数

In [25]:drinks.select_dtypes(include='number').head()Out[25]:
beer_servingsspirit_servingswine_servingstotal_litres_of_pure_alcohol
00000.0
189132544.9
2250140.7
324513831212.4
421757455.9

这包含了int和float型的列。


你也可以使用这个函数来选取数据类型为object的列:

51f60a7859f875923e267061c0b35c88.png

你还可以选取多种数据类型,只需要传递一个列表即可:

0498c3d235b1ee4153aba1870cae5f42.png

你还可以用来排除特定的数据类型:

645e5b03473df967cf84cbbc928acd16.png

将字符型转换为数值型

让我们来创建另一个示例DataFrame:

f6987f46af9ae6ec06ff6bf1381cf094.png

这些数字实际上储存为字符型,导致其数据类型为object:

2b1d37f12d14aa6f18a065d1675069c9.png

为了对这些列进行数学运算,我们需要将数据类型转换成数值型。你可以对前两列使用astype()函数

2f4279a1da8c2a20e01b4c9ca9e741d8.png

但是,如果你对第三列也使用这个函数,将会引起错误,这是因为这一列包含了破折号(用来表示0)但是pandas并不知道如何处理它。

你可以对第三列使用to_numeric()函数,告诉其将任何无效数据转换为NaN:

4a1c2e6570e4e52d1c433b87141794e6.png

如果你知道NaN值代表0,那么你可以fillna()函数将他们替换成0:

6104e34b1ffb179612d3b95beb3861fa.png

最后,你可以通过apply()函数一次性对整个DataFrame使用这个函数:

3474cc4a35aef5ad7ae0e747ed67d7ff.png

仅需一行代码就完成了我们的目标,因为现在所有的数据类型都转换成float:

bb3bb26e54069dcf76579cdbdda72f13.png

减小DataFrame空间大小

pandas DataFrame被设计成可以适应内存,所以有些时候你可以减小DataFrame的空间大小,让它在你的系统上更好地运行起来。


这是drinks这个DataFrame所占用的空间大小:

2f839c831eebaa48efb782c97ca8ebb1.png

可以看到它使用了30.4KB。


如果你对你的DataFrame有操作方面的问题,或者你不能将它读进内存,那么在读取文件的过程中有两个步骤可以使用来减小DataFrame的空间大小。

第一个步骤是只读取那些你实际上需要用到的列,可以调用usecols参数:

9a8c464f1163ad52e808f095e34817cc.png

通过仅读取用到的两列,我们将DataFrame的空间大小缩小至13.6KB。


第二步是将所有实际上为类别变量的object列转换成类别变量,可以调用dtypes参数:

f72598adcd392b45d0688514a2174e52.png

通过将continent列读取为category数据类型,我们进一步地把DataFrame的空间大小缩小至2.3KB。


值得注意的是,如果跟行数相比,category数据类型的列数相对较小,那么catefory数据类型可以减小内存占用。

按行从多个文件中构建DataFrame

假设你的数据集分化为多个文件,但是你需要将这些数据集读到一个DataFrame中。


举例来说,我有一些关于股票的小数聚集,每个数据集为单天的CSV文件。这是第一天的:

c55c242403bda9f7ce58289ebe8184ba.png

这是第二天的:

01595e1364274d57edd23d9b9401ab2c.png

这是第三天的:

4120a4d194933832ea360bd9ff123e00.png

你可以将每个CSV文件读取成DataFrame,将它们结合起来,然后再删除原来的DataFrame,但是这样会多占用内存且需要许多代码


更好的方式为使用内置的glob模块。你可以给glob()函数传递某种模式,包括未知字符,这样它会返回符合该某事的文件列表。在这种方式下,glob会查找所有以stocks开头的CSV文件:

b692a37e391d19f1954a464af5c7c9dd.png

glob会返回任意排序的文件名,这就是我们为什么要用Python内置的sorted()函数来对列表进行排序。


我们以生成器表达式用read_csv()函数来读取每个文件,并将结果传递给concat()函数,这会将单个的DataFrame按行来组合:

61cd879ad5287c991798684e488cb410.png

不幸的是,索引值存在重复。为了避免这种情况,我们需要告诉concat()函数来忽略索引,使用默认的整数索引:

9881403e6ecbc30344297685d5215197.png

按列从多个文件中构建DataFrame

上一个技巧对于数据集中每个文件包含行记录很有用。但是如果数据集中的每个文件包含的列信息呢?


这里有一个例子,dinks数据集被划分成两个CSV文件,每个文件包含三列:

4884a671870a4efd94b122f366bbd464.png

同上一个技巧一样,我们以使用glob()函数开始。这一次,我们需要告诉concat()函数按列来组合:

3f054c5b36961d9a5363722e3f4a9022.png

现在我们的DataFrame已经有六列了。

End.

译者:山阴少年

来源:博客园

原文链接:https://nbviewer.jupyter.org/github/justmarkham/pandas-videos/blob/master/top_25_pandas_tricks.ipynb

本文为转载,如有侵权请联系后台删除

好文章,我在看❤️

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/476841.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 820. 单词的压缩编码(后缀树)

文章目录1. 题目2. 解题2.1 反转字符串字符查找2.2 后缀树1. 题目 给定一个单词列表,我们将这个列表编码成一个索引字符串 S 与一个索引列表 A。 例如,如果这个列表是 ["time", "me", "bell"],我们就可以将其…

sql查询分页

用sql 查询时select top 10 * from Orders order by orderid desc操作时,我们先对查询结果进行ordersby排序 然后才取出其最前边10个使用sql查询分页时的几点思路(举例均从查询第100到120之间20条记录)1.取前120条记录orderby主键&#xff0c…

openstack实例状态错误_Openstack虚机操作总结

1. 概览Openstack作为常见的IAAS服务,其最核心的对象就是虚机实例,而Openstack下支持的虚机操作有很多种,有些是特别常见的虚机操作比如创建虚机、启动虚机、删除虚机等,而有些虚机操作则是针对特定场景下比如出现故障而提供的保护…

神网站PaperWithoutCode:举报无法复现的论文,让一作社死??

文 | 小戏几乎是可以肉眼可见的看到机器学习领域的论文几何级的增长,在铺天盖地的论文雪花纸片般涌来时,灌水、可复现性、工作真实的意义这些概念也伴随着 Paper 的洪水进入了人们的视野。谈及科研,我们总是站在以往研究的基础上,…

仿WINDWS无限级Ajax菜单树升级1.3版(修补了严重BUG)

仿WINDWS无限级Ajax菜单树升级1.3版(修补了严重BUG) WINDWS无限级Ajax菜单树又升级了(1.3版) 对以下BUG进行了修复 1.只能在文字上拖拽(不能从文件夹图标上拖) 2.拖拽后不刷新菜单的BUG(拖拽为子级菜单后,菜单原地不消失的情况。也…

程序员面试金典 - 面试题 08.11. 硬币(背包DP)

文章目录1. 题目2. 解题1. 题目 硬币。给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算 n 分有几种表示法。(结果可能会很大,你需要将结果模上1000000007) 示例1:输入: n 5输出:2解释: 有两种方式可以凑成总金额:…

ab的plc跟西门子哪个好些_2020滚筒洗衣机哪个牌子好?想买滚筒洗衣机的看过来!...

滚筒洗衣机哪个牌子好?想买滚筒洗衣机的人越来越多,滚筒洗衣机无疑是现在大多数年轻人更喜欢的款式,颜值高、功能多、追求个性化洗衣操作,滚筒的不伤衣物更温柔对于有真丝雪纺面料衣物的,滚筒洗衣机现在真是越来越智能…

AI开始参与政治选举了??

编 | David 好困源 | 新智元让AI去参加议会选举,能成吗?一个丹麦政党让AI聊天机器人当了领袖,试图在议会中拿下一席,现距离20000个提名的门槛线仅差19988个了。现在的AI能干的事情太多了,写作文、画画、下棋、玩游戏&a…

Linux NAT设定

1:echo "1" >/proc/sys/net/ipv4/ip_forward 或vi /proc/sys/net/ipv4/ip_forward把0改为1,0表示IP FORWARDING功能是关闭,1表示开启。2:iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0/24 -j MASQUERADE &a…

程序员面试金典 - 面试题 16.02. 单词频率(哈希表/Trie树)

文章目录1. 题目2. 解题2.1 哈希解法2.2 Trie树1. 题目 设计一个方法,找出任意指定单词在一本书中的出现频率。 你的实现应该支持如下操作: WordsFrequency(book)构造函数,参数为字符串数组构成的一本书get(word)查询指定单词在数中出现的…

加州大学博士生Wendy:谈论文精读与方法创新

最近刷朋友圈,很多童鞋的状态都是,不是在搞科研,就是在搞科研的路上,每日为了科研废寝忘食……每天的生活日常,除了下文献、读文献,就是做实验、写论文,debug,二十多岁的自己看着像三…

小米10pro第二个摄像头下面_小米10至尊纪念版、小米10 Pro对比评测:至尊版“至尊”在哪里?...

在几天前的雷军十周年演讲中,小米10至尊纪念版正式面世,价格刚公布,就引起了不小轰动。在吃瓜群众看来,小米终于迈向了高端,毕竟最贵的版本,售价可以卖到6999元,和三星、苹果旗舰保持在一个水准…

转:程序员每天该做的事

程序员每天该做的事 1、总结自己一天任务的完成情况 最好的方式是写工作日志,把自己今天完成了什么事情,遇见了什么问题都记录下来,日后翻看好处多多 >> 好记性不如烂笔头。呵呵 2、考虑自己明天应该做的主要工作 把明天要做的事情…

MiOJ 3. 大数相减(字符串减法)

1. 题目 描述 两个长度超出常规整形变量上限的大数相减,请避免使用各语言内置大数处理库,如 Java.math.BigInteger 等。 输入 有 N 行测试数据,每一行有两个代表整数的字符串 a 和 b,长度超过百位。规定 a>b,a, …

Saleforce发布跨模态框架LAVIS,涵盖数据、任务、模型

作者 | HJZ来源 | 机器之心Salesforce 亚洲研究院推出了一站式视觉语言开源框架 LAVIS。视觉语言模型在内容推荐、电子商务里有广泛应用,例如图像描述生成、文本图像检索以及多模态内容分类。依托于海量互联网数据,多模型模型近期得到长足发展&#xff0…

python 跳过_python-pytest学习(九)-跳过用例skip

一、前言 pytest.mark.skip可以标记无法在某些平台上运行的测试功能,或者你希望是吧的测试功能。 skip意味着只有满足某些条件时才希望测试通过,否则pytest应该跳过运行测试。常见示例是在非windows平台上跳过仅限windows的测试,或跳过测试依…

Alexa世界排名原理+作弊源码,为网站赢得好排名

虽然说 Alexa世界排名存在水分,高低都无所谓,只要能在搜索引擎中排名靠前就好了,但是一些风险投资还是把它当作网站的一个参考依据,就迫使一些网站不得不提升自己的Alexa世界排名,那如何让你的网站在Alexa世界排名靠前…

matlab和python哪个运行快_MATLAB比Python快吗?

你可以在这个链接的底部找到一些有用的结果 从介绍开始A comparison of weave with NumPy, Pyrex, Psyco, Fortran (77 and 90) and C for solving Laplaces equation. 它还比较了MATLAB,并显示了与使用Python和NumPy时类似的速度。 当然,这只是一个特定…

LeetCode 1162. 地图分析(BFS)

1. 题目 你现在手里有一份大小为 N x N 的『地图』(网格) grid,上面的每个『区域』(单元格)都用 0 和 1 标记好了。其中 0 代表海洋,1 代表陆地,你知道距离陆地区域最远的海洋区域是是哪一个吗…

邹建老大写的经典SQL

邹建老大写的经典SQL/Files/602544/SQLServer2000.rar 转载于:https://www.cnblogs.com/602544/archive/2006/12/10/588210.html