现在关注▲领取书籍
《吴恩达机器学习》《集体智慧编程》
《对比Excel,轻松学习Python》
![f171d2c8eddcd61f28684e871170cbca.png](https://i-blog.csdnimg.cn/blog_migrate/96378cb9c5aec7ef76e92b14668ce843.jpeg)
关注你的技艺。
《程序员修炼之道》”。
本文将会涉及DataFrame的许多基本操作。许多方案将与前面介绍的Pandas基础中的方案类似,本文主要介绍了对Series的操作。
![fe21c9dcabfef68b6c429631cc6320d3.gif](https://i-blog.csdnimg.cn/blog_migrate/399694781832c5af532dc8a5c7f3ebbd.gif)
选择多个DataFrame列
我们可以通过将列名传递给DataFrame的索引操作符来选择单列。这一点在之前的Pandas基础中的选择列口诀中已经介绍过。通常需要关注当前工作数据集的一个子集,这可以通过选择多个列来实现。
在这个方案中,将从电影数据集中选择所有的演员和导演列。
下面我们展开分析一下如何实现。
1. 读取电影数据集,并将所需列的列表传递给索引操作符:
>>> import pandas as pd>>> import numpy as np>>> movies = pd.read_csv("data/movie.csv")>>> movie_actor_director = movies[... [... "actor_1_name",... "actor_2_name",... "actor_3_name",... "director_name",... ]... ]>>> movie_actor_director.head() actor_1_name actor_2_name actor_3_name director_name0 CCH Pounder Joel Dav... Wes Studi James Ca...1 Johnny Depp Orlando ... Jack Dav... Gore Ver...2 Christop... Rory Kin... Stephani... Sam Mendes3 Tom Hardy Christia... Joseph G... Christop...4 Doug Walker Rob Walker NaN Doug Walker
2. 在有些情况下,需要选择DataFrame中的一列。使用索引操作可以返回一个Series或者DataFrame。如果我们传入一个包含单项的列表,我们将得到一个DataFrame。如果我们只传入一个带有列名的字符串,我们将得到一个Series。
>>> type(movies[["director_name"]])<class 'pandas.core.frame.DataFrame'>>>> type(movies["director_name"])<class 'pandas.core.series.Series'>
3. 我们也可以使用 .loc 来按名称拉出一列。因为这个索引操作需要我们先传入一个行选择器,所以我们将使用冒号(:)来表示一个选择所有行的分片。这也可以返回一个DataFrame或一个Series:
>>> type(movies.loc[:, ["director_name"]])<class 'pandas.core.frame.DataFrame'>>>> type(movies.loc[:, "director_name"])<class 'pandas.core.series.Series'>
DataFrame索引操作符非常灵活,能够接受许多不同的对象。如果传递一个字符串,它将返回一个单维的Series。如果向索引操作符传递一个列表,它将以指定的顺序返回一个列表中所有列的DataFrame。
步骤2显示了如何将单列选择为DataFrame和Series。通常情况下,用字符串选择单列,结果是一个系列。当需要一个DataFrame时,将列名放在一个单元素列表中。
步骤3展示了如何使用 loc 属性来调出Series或DataFrame。
在索引操作符内传递一个长的列表可能会导致可读性问题。为了帮助解决这个问题,你可以先将所有的列名保存到一个列表变量中。下面的代码实现了与步骤1相同的结果:
>>> cols = [... "actor_1_name",... "actor_2_name",... "actor_3_name",... "director_name",]>>> movie_actor_director = movies[cols]
在使用pandas时,最常见的异常之一是 KeyError。这一错误主要是由于错误输入了列名或索引名。每当在没有使用列表的情况下尝试选择多列时,都会引发同样的错误。
>>> ... "actor_1_name",... "actor_2_name",... "actor_3_name",... "director_name",]Traceback (most recent call last): ...KeyError: ('actor_1_name', 'actor_2_name', 'actor_3_name', 'director_name')
选择列的方法
虽然列的选择通常是通过索引操作符来完成的,但是有一些DataFrame方法可以以另一种方式方便选择。.select_dtypes 和 .filter 方法是两种有用的方法。
如果你想按类型选择,你需要熟悉pandas的数据类型。前面Pandas基础中的Understanding data types recipe解释了这些类型。
下面我们来分析一下如何实现。
1. 读入电影数据集。缩短列名以便显示。使用 .get_dtype_counts 方法输出每个特定数据类型的列数。
>>> movies = pd.read_csv("data/movie.csv")>>> def shorten(col):... return (... str(col)... .replace("facebook_likes", "fb")... .replace("_for_reviews", "")... )>>> movies = movies.rename(columns=shorten)>>> movies.dtypes.value_counts()float64 13int64 3object 12dtype: int64br
2. 使用 .select_dtypes 方法只选择整数列:
>>> movies.select_dtypes(include="int").head() num_voted_users cast_total_fb movie_fb0 886204 4834 330001 471220 48350 02 275868 11700 850003 1144337 106759 1640004 8 143 0br
3.如果您想选择所有的数字列,您可以将字符串编号传递给include参数:
>>> movies.select_dtypes(include="number").head() num_critics duration ... aspect_ratio movie_fb0 723.0 178.0 ... 1.78 330001 302.0 169.0 ... 2.35 02 602.0 148.0 ... 2.35 850003 813.0 164.0 ... 2.35 1640004 NaN NaN ... NaN 0br
4. 如果我们想要整数和字符串列,我们可以做如下操作:
>>> movies.select_dtypes(include=["int", "object"]).head() color direc/_name ... conte/ating movie_fb0 Color James Cameron ... PG-13 330001 Color Gore Verbinski ... PG-13 02 Color Sam Mendes ... PG-13 850003 Color Christopher Nolan ... PG-13 1640004 NaN Doug Walker ... NaN 0br
5.要想仅排除浮点列,请执行以下操作:
>>> movies.select_dtypes(exclude="float").head() color director_name ... content_rating movie_fb0 Color James Ca... ... PG-13 330001 Color Gore Ver... ... PG-13 02 Color Sam Mendes ... PG-13 850003 Color Christop... ... PG-13 1640004 NaN Doug Walker ... NaN 0br
6. 另一种选择列的方法是使用 .filter 方法。这种方法很灵活,根据使用哪个参数来搜索列名(或索引标签)。这里,我们使用 like 参数来搜索所有的Facebook列或包含精确字符串 fb 的名称。like 参数是检查列名中的子串:
>>> movies.filter(like="fb").head() director_fb actor_3_fb ... actor_2_fb movie_fb0 0.0 855.0 ... 936.0 330001 563.0 1000.0 ... 5000.0 02 0.0 161.0 ... 393.0 850003 22000.0 23000.0 ... 23000.0 1640004 131.0 NaN ... 12.0 0br
7. .filter 方法有更多的技巧(或参数)。如果你使用 items 参数,你可以传入一个列名列表:
>>> cols = [ , , , , ]>>> movies.filter actor_1_name director_name0 CCH Pounder James Cameron1 Johnny Depp Gore Verbinski2 Christoph Waltz Sam Mendes3 Tom Hardy Christopher Nolan4 Doug Walker Doug Walkerbr
8. .filter 方法允许使用 regex 参数用正则表达式搜索列。在这里,我们搜索所有名称中带有数字的列:
>>> movies.filter actor_3_fb actor_2_name actor_3_name actor_2_fb0 855.0 Joel Dav. Wes Studi 936.01 1000.0 Orlando Jack Dav. 5000.02 161.0 Rory Kin. Stephani. 393.03 23000.0 Christia. Joseph G. 23000.04 NaN Rob Walker NaN 12.0br
我们来分析一下这些操作步骤是如何起作用的
步骤1列出了所有不同数据类型的频率。
另外,您也可以使用 .dtypes 属性来获取每列的准确数据类型。.select_dtypes 方法在其 include 或 exclude 参数中接受一个列表或单个数据类型,并返回一个只包含给定数据类型列的DataFrame(如果排除列,则不包含这些类型)。
列表值可以是数据类型的字符串名称,也可以是实际的Python对象。
.filter 方法只通过检查列名而不是实际的数据值来选择列。它有三个相互排斥的参数:items、like 和 regex,每次只能使用其中一个。
like 参数接收一个字符串,并试图找到所有在名称中某个地方包含该字符串的列名。为了获得更多的灵活性,你可以使用 regex 参数来代替通过一个正则表达式来选择列名。这个特殊的正则表达式,r'\d',代表了从0到9的所有数字,并匹配任何至少包含一位数字的字符串。
过滤器方法还附带了另一个参数 items,它取一个精确的列名列表。这几乎是索引操作的完全重复,只是如果其中一个字符串不匹配列名,将不会引发 KeyError。例如,movies.filter(items=['actor_1_name', 'asdf']) 运行时没有出错,并返回一个单一的列DataFrame。
.select_dtypes 的一个令人困惑的方面是它可以灵活地接受字符串和Python对象。下面的列表应该可以澄清所有可能的方法来选择许多不同的列数据类型。在pandas中,没有标准或首选的数据类型引用方法,所以了解这两种方法是很好的:
np.number , 'number' - 同时选择整数和浮点数,不考虑大小。
np.float64, np.float_, float, 'float64', 'float_' , 'float' - 只选择64位的浮点数。
np.float16, np.float32, np.float128, 'float16', 'float32', 'float128' - 分别选择16, 32, 和128位的浮点数。
np.floating, 'floating' - 选择所有浮动值,而不考虑其大小。
np.int0, np.int64, np.int_, int, 'int0', 'int64', 'int_', 'int' - 只选择64位整数。
np.int8, np.int16, np.int32, 'int8', 'int16', 'int32' - 分别选择8、16和32位整数。
np.integer, 'integer' - 选择所有的整数,无论大小。
'Int64' - 选择可空的整数;没有NumPy对应的数值。
np.object, 'object', 'O' - 选择所有对象数据类型。
np.datetime64, 'datetime64', 'datetime' - 所有的日期都是64位。
np.timedelta64, 'timedelta64', 'timedelta' - 所有的定时器都是64位。
pd.Categorical, 'category' - 对熊猫来说是独一无二的;没有NumPy的对应物。
因为所有的整数和浮点数都默认为64位,所以你可以使用字符串 "int" 或 "float" 来选择它们,正如你可以从前面的子弹列表中看到的那样。如果你想选择所有的整数和浮点数,而不考虑它们的具体大小,可以使用字符串 "number"。
本篇基本数据框架操作介绍就到这,请关注我们,下一篇基本数据框架操作撰写中。
作者 | ?君 | 当值编辑 | Sunteen
分享赞在看都看到这了,一键三连,总得给一连吧?都看到这了,一键三连,总得给一连吧?