python怎么选取不连续的列_在DataFrame中选择列的小技巧

本文介绍了在Python的Pandas库中,使用iloc选择DataFrame中不连续列的技巧,包括通过整数索引、切片、布尔数组等方法。文章通过实例演示了如何高效地选取和操作数据集中的特定列,适用于处理大量列的数据集,旨在提高数据分析效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。

介绍

本文将讨论使用iloc处理具有大量列的数据集的几个技巧和快捷方式。即使您有一些使用iloc的经验,您也应该学习一些有用的技巧来加速您自己的分析,并避免在您的代码中键入大量的列名。

为什么我们要关心列的选择?

在许多标准数据科学示例中,列的数量相对较少。例如,Titanic有8个,Iris有4个,Boston Housing有14个。现实生活中的数据集很混乱,常常包含许多额外的(可能不必要的)列。

在数据科学问题中,出于一个或多个下列原因,您可能需要选择列的一个子集:

将数据过滤为只包含相关的列有助于缩小内存占用并加快数据处理速度。

限制列的数量可以减少您在头脑中保留数据模型的脑力开销。

在研究一个新数据集时,我们可能需要将任务分解成可管理的块。

在某些情况下,您可能需要遍历列并执行计算或清理,以获得进一步分析所需要的格式的数据。

您的数据可能只包含不必要的额外或重复信息。

不管什么原因,您可能并不总是需要这些技术。但是,当您需要时,下面列出的技巧可以减少您在数据列上争论的时间。

另外,如果您喜欢这类内容,我鼓励您去看看Kevin Markham的《pandas小技巧》,它是下面一些技巧的灵感来源。

数据

为了举例说明,我将使用来自中央公园松鼠普查的一个古怪的数据集。是的,很明显,他们在中央公园里数松鼠并给它们分了类。我认为这是一个很有趣的例子。这也给了我一个在我的帖子中加入一张松鼠图片的机会(来源:GeorgeB2)。

这个数据集包括3023行数据和31列。虽然31列不是一个非常多的列,但它是一个很有用的示例,可以用来说明您可以将哪些概念应用到包含更多列的数据中。

如果您想查看,您可以查看该notebook或者直接从github上下载。

让我们从读入数据开始。

有时候,根据索引来记住每个列名及其所在的位置是很困难的。下面是一个简单的列表推导式,用于构建一个包含所有列及其索引的引用列表。

它创建了这样一个列表:

在某些情况下,如果您想重命名一堆列,您可以使用一个字典推导式来创建一个数据的字典视图:

它创建了这个字典:

在您的分析过程中,定义这些变量可能很有用。您可以在分析过程中再次检查变量名,而不是重复查看原始文件。

我经常遇到的另一个常见任务是重命名一堆跨文件且命名不一致的列。我使用一个字典来轻松地重命名所有的列,使用类似df.rename(columns=col_mapping)的方法输入所有的列名可能是一个容易出错的任务。一个简单的技巧是复制excel中的所有列,并使用pd.read_clipboard()来构建一个小的DataFrame,并将这些列转换成一个字典。如果需要,我可以手动输入新名称。

下面是这个数据集的一个简单示例。注意,我们传入sep来解析一个以制表符分隔的字符串:

它创建了一个相对容易填充新名称的字典:

另外,您甚至可以使用一个Excel文件来设置列的重命名并使整个过程自动化。这个技巧超出了本文的范围。如果您有兴趣的话,请在评论中告诉我。

使用iloc

我们将介绍的主要函数是pandas的iloc,它用于基于整数位置的索引。新用户可能会有点困惑,因为iloc和loc可接受一个布尔数组,这将导致更强大的索引能力。由于这两个函数都可以接受一个布尔数组作为输入,所以有时这些函数会产生相同的输出。然而,就本文的范围而言,我将只关注iloc列的选择。

这里有一个简单的图形来说明iloc的主要用法:

例如,如果您想查看所有行数据的Squirrel ID列:

如果您想查看X和Y的位置以及ID,您可以传入一个整数列表[0,1,2]:

3023行×3列

键入所有的列不是最有效的,所以我们可以使用切片符号使这一点更容易理解:

它将生成与上面相同的输出。

如果您有使用python列表的经验,并且稍微使用过pandas;所有这些用法都是有用的。这些要点是pandas 101的概念,但我们将从这里开始。

虽然这两种方法都很简单,但是如果您想要将整数列表与切片符号结合使用,该怎么办呢?您可以这样尝试:

或者,您可以这样尝试:

嗯…,这显然不能工作,但似乎对选择范围以及单个列来说很有用。

幸运的是,有一个numpy对象可以帮助我们。r_对象将“沿着第一个轴将切片对象转换为级联”。“从文档来看,它可能没有多大意义,但它确实满足了我们的需要。

下面是一个稍微复杂一点的例子,展示了它是如何在单个列表项和切片范围的组合上工作的:

这很酷。这个对象已经将整数列表和切片表示法的组合转换成了一个单个的列表,我们可以将它传递给iloc:

3023行×20列

这里是另一个技巧。您在使用read_csv读取数据时,也可以使用这个符号:

我发现,当您有一个数据集,并希望保留不连续的列,而不希望键入所有列的全名时,这种符号很有用。

我要提出的一个警告是,在使用切片符号时您需要很小心,并且要记住范围中的最后一个数字不会包含在生成的数字列表中。

例如,如果我们指定范围2:4,我们只会得到一个2和3的列表:

如果您希望包含列索引4,请使用np.r_[2:5]。

关于np.r_ 的最后一点需要注意的是:它有一个可选的步长参数。在这个例子中,我们可以指定这个列表将以2进行增加:

这是一个更高级的选项,对于一个新的pandas用户来说,直观上并不明显。但是,如果您曾经发现自己通过索引解析了很多列,那么这可能是解决此复杂场景的有用工具。

iloc和布尔数组

筛选列的最强大的方法之一是向iloc传递一个布尔型数组来选择列的一个子集。这听起来有点复杂,但是通过几个例子我们应该会更容易理解一些。

最重要的概念是,我们不是手动生成布尔型数组,而是使用另一个pandas函数的输出来生成该数组并将其提供给iloc。

在本例中,我们可以像对pandas数据的任何其他列一样对一个列索引使用str访问器。这将生成iloc所需的布尔型数组。一个例子应该有助于说明这一点。

如果我们想看看哪些列包含单词“run”:

然后我们可以传入这个新的布尔值数组来只选择两列:

在实践中,许多人会使用lambda函数以一行代码来实现这一点:

使用str函数的好处是,您可以对潜在的过滤器选项进行完善。例如,如果我们想要名称中包含“district”、“precinct”或“boundaries”的所有列:

我们甚至可以将所有这些概念结合在一起,使用布尔数组的结果来得到索引,然后使用np.r_将这些列表合并在一起。

下面是一个例子,我们想把所有位置相关的列以及squirrel ID放到一个DataFrame中:

这段代码有点复杂,因为我们使用的是一个条件式列表推导式,而且对于选择7列来说可能有些多余。重要的概念是,当您在分析中用到它时,您知道这是可能的,并且可以回到本文来参考它。

警告

在处理列的数字索引时需要记住的一点是,您需要了解您的数据的来源。如果您希望您的ID列总是位于特定的位置,并且它改变了数据中的顺序,那么在后续的数据处理中您可能会遇到问题。这种情况下,您的领域知识和专业知识将发挥作用,以确保解决方案对于给定的情况来说足够健壮。

总结

我的大多数数据分析都涉及到过滤和选择行级别的数据。然而,有时以列方式处理数据是很有帮助的。对于快速有效地处理具有许多列数据的数据集来说,Pandas iloc是一个有用的工具。我希望本文提供的一些技巧可以有助于您进行自己的分析。

更改2019年12月1日:更新了拼写错误,明确了read_clipboard使用制表符分隔符的用法。英文原文:https://pbpython.com/selecting-columns.html

译者:Nothing

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值