使用 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解决顺序问题。
方式2python 中的 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:不需要转换任何东西所以,可以简化成:
同样可以实现需求。
你认为这几种方式怎么样?你还能想到其他的实现方式吗?
转发、关注,留言,获得本期源码和数据。