pandas head 显示全部_Pandas 基本数据框架操作 第一篇

本文详细介绍了在Pandas中选择DataFrame的列,包括通过索引操作符、.loc属性以及使用.select_dtypes和.filter方法。通过实例展示了如何按数据类型选择列,如整数、浮点数、数字以及使用正则表达式筛选列名。此外,还提到了KeyError的常见原因和处理方法。
摘要由CSDN通过智能技术生成

现在关注▲领取书籍

《吴恩达机器学习》《集体智慧编程》

《对比Excel,轻松学习Python》

7013c4f3cc17dac070302136688ed0e0.png

f171d2c8eddcd61f28684e871170cbca.png

关注你的技艺。

《程序员修炼之道》”。

本文将会涉及DataFrame的许多基本操作。许多方案将与前面介绍的Pandas基础中的方案类似,本文主要介绍了对Series的操作。

fe21c9dcabfef68b6c429631cc6320d3.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')

2e1ad6c61349f246d241197a6fc52c53.gif

选择列的方法

虽然列的选择通常是通过索引操作符来完成的,但是有一些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

4093fe4eb0d88d472f4a415df9c7bb13.gif

我们来分析一下这些操作步骤是如何起作用的

步骤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"。

本篇基本数据框架操作介绍就到这,请关注我们,下一篇基本数据框架操作撰写中。

e7109b2ff68122ead6b7e4a1c948a0ed.gif

作者 | ?君 | 当值编辑 | Sunteen

分享赞在看都看到这了,一键三连,总得给一连吧?都看到这了,一键三连,总得给一连吧?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值