前言使用 pandas 选择列是非常容易的事情。如下泰坦尼克号事件数据: ![]() 我不需要最后3列数据,一般会使用选择列完成: ![]() 但在列数很多的情况下,代码显得比较繁琐。有没有一种方式指定'不想要的列'? pandas 真的内置了这样的函数: ![]() 真方便。但跟我学习 pandas 专栏的小伙伴应该知道,我不建议花精力学习这种特殊场景的函数。因为这种函数的数量成百上千,随着 pandas 版本升级,有些函数还会被丢弃(不能使用)。
因此,今天并不是仅仅介绍 pandas 有这么一个功能函数。而是分享几种达到相同目的的实现方式。更重要的是,教会大家一种解决问题的通用思路。 方式1在一个集合(序列数据)中剔除指定的元素,我第一时间想到的是 python 内置的 set 。set 是 python 基本数据类型之一,非常有用。通常我们会在如下场景。 去重: ![]() 交集,就是2个 set 之间共有的元素: ![]() 在本案例中,我们应用了差集的特性,实现剔除效果: ![]()
它的缺点也很明显,就是元素排列是没有顺序的。 ![]() 那我们使用方式2解决顺序问题。 方式2python 中的 set ,其实与字典的 key 是非常相似,可以使用 in 很容易判断一个元素是否在一个 set 里面: ![]() 利用这个特性,很容易实现剔除功能,并且保留顺序: ![]() 由于这种需求很常见,python 甚至提供了语法糖。因此我们并不需要特意使用 set : ![]() 有小伙伴会说,'方式1和2都需要一些 python 基础,我就想用 pandas 方式解决'。 好,那我们看看方式3。
方式3前面的方式涉及到 python 的列表和集合,大家有没有注意到,其实它们都是序列而已,就是保存一堆内容的容器,只不过它们各自拥有一些特殊规则。 pandas 的 dataframe、series 不也是'保存一堆内容的容器'吗? 例如,我们可以很容易把表的列名变成一个表格: ![]() 既然是表格,就可以使用普通的表格筛选: ![]()
现在一样得到需要的列名。但是,为什么必须用表格呀,'一堆列名' 应该是一维的数据容器,用 series 行不行? ![]()
但是,大家有没有想过, df.columns 不也是容器吗?那么你认为 pandas 的作者会不会为这个容器设计一个 isin 函数?试试看: ![]()
所以,可以简化成: ![]() 同样可以实现需求。 你认为这几种方式怎么样?你还能想到其他的实现方式吗? |
|