不愧是python数据处理库第一选择,pandas反向选择列功能都内置了

我是数据外星人 2024-02-21 01:20:18
前言

使用 pandas 选择列是非常容易的事情。如下泰坦尼克号事件数据:

我不需要最后3列数据,一般会使用选择列完成:

但在列数很多的情况下,代码显得比较繁琐。有没有一种方式指定"不想要的列"?

pandas 真的内置了这样的函数:

真方便。但跟我学习 pandas 专栏的小伙伴应该知道,我不建议花精力学习这种特殊场景的函数。因为这种函数的数量成百上千,随着 pandas 版本升级,有些函数还会被丢弃(不能使用)。

我的pandas专栏使用pandas版本是0.25,现在pandas已经到了2.0。但专栏中我定义为基础核心的内容(大概前20节),几乎原封不动,仍然可用。随着pandas 2.0 发布,专栏也会补充相关有用的新知识

因此,今天并不是仅仅介绍 pandas 有这么一个功能函数。而是分享几种达到相同目的的实现方式。更重要的是,教会大家一种解决问题的通用思路。

方式1

在一个集合(序列数据)中剔除指定的元素,我第一时间想到的是 python 内置的 set 。set 是 python 基本数据类型之一,非常有用。通常我们会在如下场景。

去重:

交集,就是2个 set 之间共有的元素:

在本案例中,我们应用了差集的特性,实现剔除效果:

把 df 的表头转成 set ,直接减去希望剔除列名的 set。结果是一个新的 set新版的 pandas 不允许接受 set 作为筛选列,这里先转成列表

它的缺点也很明显,就是元素排列是没有顺序的。

那我们使用方式2解决顺序问题。

方式2

python 中的 set ,其实与字典的 key 是非常相似,可以使用 in 很容易判断一个元素是否在一个 set 里面:

利用这个特性,很容易实现剔除功能,并且保留顺序:

由于这种需求很常见,python 甚至提供了语法糖。因此我们并不需要特意使用 set :

有小伙伴会说,"方式1和2都需要一些 python 基础,我就想用 pandas 方式解决"。

好,那我们看看方式3。

不要忘记一键三连。你的点赞、收藏、关注,是我创作的动力。

方式3

前面的方式涉及到 python 的列表和集合,大家有没有注意到,其实它们都是序列而已,就是保存一堆内容的容器,只不过它们各自拥有一些特殊规则。

pandas 的 dataframe、series 不也是"保存一堆内容的容器"吗? 例如,我们可以很容易把表的列名变成一个表格:

既然是表格,就可以使用普通的表格筛选:

行1: to_frame 转成 dataframe行2: cols[0] 取出表格的名叫 0 的列,用 isin 得到 bool 列,我们需要的是给定的3列除外的列,因此使用 ~ 把条件取反

现在一样得到需要的列名。但是,为什么必须用表格呀,"一堆列名" 应该是一维的数据容器,用 series 行不行?

行1:转化成 series行2:现在 cols 不是表格,不需要"取出列"

但是,大家有没有想过, df.columns 不也是容器吗?那么你认为 pandas 的作者会不会为这个容器设计一个 isin 函数?试试看:

行1:不需要转换任何东西

所以,可以简化成:

同样可以实现需求。

你认为这几种方式怎么样?你还能想到其他的实现方式吗?

转发、关注,留言,获得本期源码和数据。

0 阅读:0

我是数据外星人

简介:感谢大家的关注